]> git.gir.st - VimFx.git/blob - packages/vim.coffee
Added preferences, some refactoring, hint char hundling bug fixing
[VimFx.git] / packages / vim.coffee
1 { getWindowId, Bucket } = require 'utils'
2
3 { commands,
4 hintCharHandler
5 } = require 'commands'
6
7 MODE_NORMAL = 1
8 MODE_HINTS = 2
9
10 class Vim
11 constructor: (@window) ->
12 @mode = MODE_NORMAL
13 @keys = []
14 @markers = undefined
15 @cb = undefined
16
17 pushKey: (keyStr) ->
18 if _maybeCommand(@mode, @keys, keyStr)
19 @keys.push keyStr
20 return true
21
22 return false
23
24 execKeys: ->
25 console.log @keys.join(',')
26 if command = _getCommand(@mode, @keys)
27 lastKey = @keys[@keys.length - 1]
28 command @
29 @keys = []
30 return lastKey != 'Esc'
31
32 enterHintsMode: () ->
33 @mode = MODE_HINTS
34
35 enterNormalMode: () ->
36 @markers = @cb = undefined
37
38 @mode = MODE_NORMAL
39
40 _getCommand = (mode, keys) ->
41 lastKey = keys[keys.length - 1]
42
43 if mode == MODE_NORMAL or lastKey == 'Esc'
44 sequence = keys.join(',')
45 if command = commands[sequence]
46 return command
47 else if keys.length > 0
48 return _getCommand mode, keys.slice(1)
49
50 else if mode == MODE_HINTS and keys.length > 0
51 # `lastKey` should be one hint chars or `Backspace`
52 hintChars = getPref('hint_chars') + 'backspace'
53 if hintChars.search(lastKey.toLowerCase()) > -1
54 return (vim) =>
55 return hintCharHandler(vim, lastKey.toLowerCase())
56
57 return undefined
58
59 _maybeCommand = (mode, keys, keyStr) ->
60 if mode == MODE_NORMAL || keyStr == 'Esc'
61 sequence = keys.concat([keyStr]).join(',')
62 for commandSequence in Object.keys(commands)
63 if commandSequence.search(sequence) == 0
64 return true
65
66 if keys.length > 0
67 return _maybeCommand mode, keys.slice(1), keyStr
68
69 else if mode == MODE_HINTS
70 return true
71
72 return false
73
74 exports.Vim = Vim
Imprint / Impressum