aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2015-02-03 15:32:00 +0000
committerStephen Blott2015-02-03 15:32:00 +0000
commitd22a66f91a12aef832a87f39a1376b2f97fcfe94 (patch)
tree999e83ab6e65710f3a00c41b651625b262411a8d
parent71b609e5e23a894a551884f118d3625251c7aad3 (diff)
parentb082b11942dac88cff4ddb22ae0bc4426cf98bf5 (diff)
downloadvimium-d22a66f91a12aef832a87f39a1376b2f97fcfe94.tar.bz2
Merge branch 'find-mode-history'
Conflicts: content_scripts/vimium_frontend.coffee
-rw-r--r--content_scripts/vimium_frontend.coffee69
-rw-r--r--lib/keyboard_utils.coffee2
2 files changed, 56 insertions, 15 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 56aabdca..a9e44ed2 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -48,7 +48,7 @@ settings =
values: {}
loadedValues: 0
valuesToLoad: ["scrollStepSize", "linkHintCharacters", "linkHintNumbers", "filterLinkHints", "hideHud",
- "previousPatterns", "nextPatterns", "findModeRawQuery", "regexFindMode", "userDefinedLinkHintCss",
+ "previousPatterns", "nextPatterns", "findModeRawQuery", "findModeRawQueryList", "regexFindMode", "userDefinedLinkHintCss",
"helpDialog_showAdvancedCommands", "smoothScroll"]
isLoaded: false
eventListeners: {}
@@ -666,6 +666,28 @@ exitInsertMode = (target) ->
isInsertMode = ->
return false # Disabled.
+# This implements a find-mode query history (using the "findModeRawQueryList" setting) as a list of raw
+# queries, most recent first.
+FindModeHistory =
+ getQuery: (index = 0) ->
+ @migration()
+ recentQueries = settings.get "findModeRawQueryList"
+ if index < recentQueries.length then recentQueries[index] else ""
+
+ recordQuery: (query) ->
+ @migration()
+ if 0 < query.length
+ recentQueries = settings.get "findModeRawQueryList"
+ settings.set "findModeRawQueryList", ([ query ].concat recentQueries.filter (q) -> q != query)[0..50]
+
+ # Migration (from 1.49, 2015/2/1).
+ # Legacy setting: findModeRawQuery (a string).
+ # New setting: findModeRawQueryList (a list of strings).
+ migration: ->
+ unless settings.get "findModeRawQueryList"
+ rawQuery = settings.get "findModeRawQuery"
+ settings.set "findModeRawQueryList", (if rawQuery then [ rawQuery ] else [])
+
# should be called whenever rawQuery is modified.
updateFindModeQuery = ->
# the query can be treated differently (e.g. as a plain string versus regex depending on the presence of
@@ -692,6 +714,9 @@ updateFindModeQuery = ->
# default to 'smartcase' mode, unless noIgnoreCase is explicitly specified
findModeQuery.ignoreCase = !hasNoIgnoreCaseFlag && !Utils.hasUpperCase(findModeQuery.parsedQuery)
+ # Don't count matches in the HUD.
+ HUD.hide(true)
+
# if we are dealing with a regex, grep for all matches in the text, and then call window.find() on them
# sequentially so the browser handles the scrolling / text selection.
if findModeQuery.isRegex
@@ -717,12 +742,15 @@ updateFindModeQuery = ->
text = document.body.innerText
findModeQuery.matchCount = text.match(pattern)?.length
-handleKeyCharForFindMode = (keyChar) ->
- findModeQuery.rawQuery += keyChar
+updateQueryForFindMode = (rawQuery) ->
+ findModeQuery.rawQuery = rawQuery
updateFindModeQuery()
performFindInPlace()
showFindModeHUDForQuery()
+handleKeyCharForFindMode = (keyChar) ->
+ updateQueryForFindMode findModeQuery.rawQuery + keyChar
+
handleEscapeForFindMode = ->
exitFindMode()
document.body.classList.remove("vimiumFindMode")
@@ -735,17 +763,14 @@ handleEscapeForFindMode = ->
window.getSelection().addRange(range)
focusFoundLink() || selectFoundInputElement()
-# Return if character deleted, false otherwise.
+# Return true if character deleted, false otherwise.
handleDeleteForFindMode = ->
- if (findModeQuery.rawQuery.length == 0)
+ if findModeQuery.rawQuery.length == 0
exitFindMode()
performFindInPlace()
false
else
- findModeQuery.rawQuery = findModeQuery.rawQuery.substring(0, findModeQuery.rawQuery.length - 1)
- updateFindModeQuery()
- performFindInPlace()
- showFindModeHUDForQuery()
+ updateQueryForFindMode findModeQuery.rawQuery.substring(0, findModeQuery.rawQuery.length - 1)
true
# <esc> sends us into insert mode if possible, but <cr> does not.
@@ -755,10 +780,12 @@ handleEnterForFindMode = ->
exitFindMode()
focusFoundLink()
document.body.classList.add("vimiumFindMode")
- settings.set("findModeRawQuery", findModeQuery.rawQuery)
+ FindModeHistory.recordQuery findModeQuery.rawQuery
class FindMode extends Mode
constructor: ->
+ @historyIndex = -1
+ @partialQuery = ""
super
name: "find"
badge: "/"
@@ -773,6 +800,17 @@ class FindMode extends Mode
handleEnterForFindMode()
@exit()
@suppressEvent
+ else if event.keyCode == keyCodes.upArrow
+ if rawQuery = FindModeHistory.getQuery @historyIndex + 1
+ @historyIndex += 1
+ @partialQuery = findModeQuery.rawQuery if @historyIndex == 0
+ updateQueryForFindMode rawQuery
+ @suppressEvent
+ else if event.keyCode == keyCodes.downArrow
+ @historyIndex = Math.max -1, @historyIndex - 1
+ rawQuery = if 0 <= @historyIndex then FindModeHistory.getQuery @historyIndex else @partialQuery
+ updateQueryForFindMode rawQuery
+ @suppressEvent
else
DomUtils.suppressPropagation(event)
handlerStack.stopBubblingAndFalse
@@ -858,7 +896,7 @@ getNextQueryFromRegexMatches = (stepSize) ->
findAndFocus = (backwards) ->
# check if the query has been changed by a script in another frame
- mostRecentQuery = settings.get("findModeRawQuery") || ""
+ mostRecentQuery = FindModeHistory.getQuery()
if (mostRecentQuery != findModeQuery.rawQuery)
findModeQuery.rawQuery = mostRecentQuery
updateFindModeQuery()
@@ -984,10 +1022,13 @@ window.goNext = ->
findAndFollowRel("next") || findAndFollowLink(nextStrings)
showFindModeHUDForQuery = ->
- if (findModeQueryHasResults || findModeQuery.parsedQuery.length == 0)
- HUD.show("/" + findModeQuery.rawQuery + " (" + findModeQuery.matchCount + " Matches)")
- else
+ if findModeQuery.rawQuery and (findModeQueryHasResults || findModeQuery.parsedQuery.length == 0)
+ plural = if findModeQuery.matchCount == 1 then "" else "es"
+ HUD.show("/" + findModeQuery.rawQuery + " (" + findModeQuery.matchCount + " Match#{plural})")
+ else if findModeQuery.rawQuery
HUD.show("/" + findModeQuery.rawQuery + " (No Matches)")
+ else
+ HUD.show("/")
getCurrentRange = ->
selection = getSelection()
diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee
index 30d99656..693c9b1c 100644
--- a/lib/keyboard_utils.coffee
+++ b/lib/keyboard_utils.coffee
@@ -1,7 +1,7 @@
KeyboardUtils =
keyCodes:
{ ESC: 27, backspace: 8, deleteKey: 46, enter: 13, space: 32, shiftKey: 16, ctrlKey: 17, f1: 112,
- f12: 123, tab: 9 }
+ f12: 123, tab: 9, downArrow: 40, upArrow: 38 }
keyNames:
{ 37: "left", 38: "up", 39: "right", 40: "down" }