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