From c1dcb39788be0c0228933a1d24a21d23d614fe2b Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Sat, 24 Jan 2015 01:20:38 +0100 Subject: [PATCH] Simplify hint matching Just like normal mode keeps track of the entered keys, hints mode now also keeps track of the entered keys (chars), instead of letting each marker do it. The markers now only keep track of themselves; how much they are matched. --- extension/lib/marker.coffee | 40 +++++++++++++++++------------------ extension/lib/modes.coffee | 16 +++++++++----- extension/resources/style.css | 1 + 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/extension/lib/marker.coffee b/extension/lib/marker.coffee index fcd290f..e0a35af 100644 --- a/extension/lib/marker.coffee +++ b/extension/lib/marker.coffee @@ -26,12 +26,14 @@ class Marker @markerElement = document.createElement('div') @markerElement.classList.add('VimFxHintMarker') + reset: -> + @setHint(@hint) + @show() + show: -> @setVisibility(true) hide: -> @setVisibility(false) setVisibility: (visible) -> @markerElement.classList.toggle('VimFxHiddenHintMarker', not visible) - updateVisibility: -> - if @hintChars.startsWith(@enteredHintChars) then @show() else @hide() # To be called when the marker has been both assigned a hint and inserted # into the DOM, and thus gotten a height and width. @@ -69,9 +71,8 @@ class Marker height, width } - setHint: (@hintChars) -> - # Hint chars that have been matched so far. - @enteredHintChars = '' + setHint: (@hint) -> + @hintIndex = 0 document = @element.ownerDocument @@ -79,32 +80,29 @@ class Marker @markerElement.firstChild.remove() fragment = document.createDocumentFragment() - for char in @hintChars + for char in @hint charContainer = document.createElement('span') - charContainer.textContent = char.toUpperCase() + charContainer.textContent = char fragment.appendChild(charContainer) @markerElement.appendChild(fragment) matchHintChar: (char) -> - @toggleLastHintChar(true) - @enteredHintChars += char.toLowerCase() - @updateVisibility() + if char == @hint[@hintIndex] + @toggleLastHintChar(true) + @hintIndex++ + return true + return false deleteHintChar: -> - @enteredHintChars = @enteredHintChars[...-1] - @toggleLastHintChar(false) - @updateVisibility() + if @hintIndex > 0 + @hintIndex-- + @toggleLastHintChar(false) toggleLastHintChar: (visible) -> - @markerElement.children[@enteredHintChars.length] - ?.classList.toggle('VimFxCharMatch', visible) + @markerElement.children[@hintIndex] + .classList.toggle('VimFxCharMatch', visible) - isMatched: -> - return @hintChars == @enteredHintChars - - reset: -> - @setHint(@hintChars) - @show() + isMatched: -> (@hintIndex == @hint.length) exports.Marker = Marker diff --git a/extension/lib/modes.coffee b/extension/lib/modes.coffee index 9469523..fc6d80c 100644 --- a/extension/lib/modes.coffee +++ b/extension/lib/modes.coffee @@ -135,12 +135,14 @@ exports['hints'] = storage.markers = markers storage.container = container storage.callback = callback + storage.numEnteredChars = 0 else vim.enterMode('normal') onLeave: (vim, storage) -> storage.container?.remove() - storage.markers = storage.container = storage.callback = undefined + for key of storage + storage[key] = null onInput: (vim, storage, keyStr, event) -> { markers, callback } = storage @@ -157,18 +159,22 @@ exports['hints'] = when @commands['delete_hint_char'].match(keyStr) for marker in markers - marker.deleteHintChar() + switch marker.hintIndex - storage.numEnteredChars + when 0 then marker.deleteHintChar() + when -1 then marker.show() + storage.numEnteredChars-- unless storage.numEnteredChars == 0 else if keyStr not in utils.getHintChars() return true - for marker in markers - marker.matchHintChar(keyStr) - + for marker in markers when marker.hintIndex == storage.numEnteredChars + match = marker.matchHintChar(keyStr) + marker.hide() unless match if marker.isMatched() dontEnterNormalMode = callback(marker, markers) vim.enterMode('normal') unless dontEnterNormalMode break + storage.numEnteredChars++ return true diff --git a/extension/resources/style.css b/extension/resources/style.css index 250455b..6527ece 100644 --- a/extension/resources/style.css +++ b/extension/resources/style.css @@ -105,6 +105,7 @@ font-family: "Helvetica Neue", "Helvetica", "Arial", "Sans"; font-weight: bold; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); + text-transform: uppercase; } .VimFxCharMatch { -- 2.39.3