]> git.gir.st - VimFx.git/blob - extension/packages/vim.coffee
Merge branch 'develop' into huffman
[VimFx.git] / extension / packages / vim.coffee
1 utils = require 'utils'
2
3 { commands
4 , hintCharHandler
5 } = require 'commands'
6
7 { getPref
8 , isCommandDisabled
9 } = require 'prefs'
10
11 MODE_NORMAL = 1
12 MODE_HINTS = 2
13
14 class Vim
15 @findStr = ''
16
17 constructor: (@window) ->
18 @mode = MODE_NORMAL
19 @keys = []
20 @lastKeyStr = null
21 @markers = undefined
22 @cb = undefined
23 @findRng = null
24
25 Object.defineProperty(this, 'findStr',
26 get: -> return Vim.findStr
27 set: (value) -> Vim.findStr = value
28 )
29
30 enterHintsMode: (@markers, @cb) ->
31 @mode = MODE_HINTS
32
33 # TODO: This function should probably remove
34 # hint markers (if they are present) as well
35 enterNormalMode: ->
36 @mode = MODE_NORMAL
37 @markers = @cb = undefined
38
39 handleKeyDown: (keyboardEvent, keyStr) ->
40 if @mode == MODE_NORMAL || keyStr == 'Esc'
41 result = maybeCommand(@keys.concat([keyStr]))
42 else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey
43 if @mode == MODE_HINTS
44 result = utils.getHintChars().search(utils.regexpEscape(keyStr)) > -1
45
46 if result
47 @lastKeyStr = keyStr
48 @keys.push keyStr
49
50 return result
51
52 handleKeyPress: (keyboardEvent) ->
53 lastKeyStr = if @keys.length > 0 then @keys[@keys.length - 1] else undefined
54 if @mode == MODE_NORMAL or lastKeyStr == 'Esc'
55 if command = findCommand(@keys)
56 command(@)
57 @keys.length = 0
58 result = true
59 else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey
60 @keys.length = 0
61 if @mode == MODE_HINTS
62 hintCharHandler(@, lastKeyStr, keyboardEvent.charCode)
63 result = true
64
65 return result
66
67 findCommand = (keys) ->
68 for i in [0...keys.length]
69 seq = keys[i..].join(',')
70 if com = commands[seq]
71 if not isCommandDisabled(seq)
72 return com
73
74 return undefined
75
76 maybeCommand = (keys) ->
77 for i in [0...keys.length]
78 sequence = keys[i..].join(',')
79 for seq, com of commands
80 if seq.indexOf(sequence) == 0
81 return not isCommandDisabled(seq)
82
83 return false
84
85 exports.Vim = Vim
Imprint / Impressum