1 utils = require 'utils'
8 { getPref } = require 'prefs'
16 constructor: (@window) ->
26 enterHintsMode: (@markers, @cb) ->
31 @markers = @cb = undefined
33 pushKey: (keyStr, keyCode) ->
34 if _maybeCommand(@mode, @keys, keyStr, keyCode)
40 execKeys: (charCode) ->
41 if command = _getCommand @mode, @keys, charCode
42 lastKey = @keys[@keys.length - 1]
45 return lastKey != 'Esc'
47 handleKeyDown: (keyboardEvent, keyStr) ->
48 if @mode == MODE_NORMAL || keyStr == 'Esc'
49 result = maybeCommand @keys.concat([keyStr])
50 else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey
51 if @mode == MODE_HINTS
52 hintChars = getPref('hint_chars').toLowerCase()
53 result = hintChars.search(utils.regexpEscape(keyStr)) > -1
54 else if @mode == MODE_FIND
57 if result then @keys.push keyStr
61 handleKeyPress: (keyboardEvent) ->
62 lastKeyStr = if @keys.length > 0 then @keys[@keys.length - 1] else undefined
63 if @mode == MODE_NORMAL or lastKeyStr == 'Esc'
64 if command = findCommand @keys
67 return lastKeyStr != 'Esc'
68 else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey
70 if @mode == MODE_HINTS
71 hintCharHandler @, lastKeyStr, keyboardEvent.charCode
73 else if @mode == MODE_FIND
74 findCharHandler @, lastKeyStr, keyboardEvent.charCode
77 findCommand = (keys) ->
78 for i in [0...keys.length]
79 if com = commands[keys.slice(i).join(',')]
84 maybeCommand = (keys) ->
85 for i in [0...keys.length]
86 sequence = keys.slice(i).join(',')
87 for seq, com of commands
88 if seq.indexOf(sequence) == 0