]> git.gir.st - VimFx.git/blob - packages/vim.coffee
Hint markers fixed: backspacing works fine now, markers are also properly hid when...
[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 keypress: (key) ->
18 @keys.push key
19 if command = _getCommand(@mode, @keys)
20 command @
21 @keys = []
22 return key != 'Esc'
23 else if _maybeCommand(@mode, @keys)
24 return true
25 else
26 @keys.pop()
27 return false
28
29 enterHintsMode: () ->
30 @mode = MODE_HINTS
31
32 enterNormalMode: () ->
33 @markers = @cb = undefined
34
35 @mode = MODE_NORMAL
36
37 _endsWithEsc = (keys) ->
38 return keys.join(',').match(/Esc$/)
39
40 _getCommand = (mode, keys) ->
41 if mode == MODE_NORMAL or _endsWithEsc(keys)
42 sequence = keys.join(',')
43 if command = commands[sequence]
44 return command
45 else if keys.length > 0
46 return _getCommand mode, keys.slice(1)
47
48 else if mode == MODE_HINTS
49 return (vim) =>
50 char = keys[keys.length - 1].toLowerCase()
51 return hintCharHandler(vim, char)
52
53 return undefined
54
55 _maybeCommand = (mode, keys) ->
56 if mode == MODE_NORMAL and keys.length > 0
57 sequence = keys.join(',')
58 for commandSequence in Object.keys(commands)
59 if commandSequence.search(sequence) == 0
60 return true
61
62 return _maybeCommand mode, keys.slice(1)
63
64 return false
65
66 exports.Vim = Vim
Imprint / Impressum