]> git.gir.st - VimFx.git/blob - extension/packages/vim.coffee
Closes #49. Now keyup event will be suppressed if keypress has been handled by VimFx
[VimFx.git] / extension / packages / vim.coffee
1 utils = require 'utils'
2
3 { commands
4 , hintCharHandler
5 , findCharHandler
6 } = require 'commands'
7
8 { getPref
9 , isCommandDisabled
10 } = require 'prefs'
11
12
13 MODE_NORMAL = 1
14 MODE_HINTS = 2
15 MODE_FIND = 3
16
17 class Vim
18 constructor: (@window) ->
19 @mode = MODE_NORMAL
20 @keys = []
21 @lastKeyStr = null
22 @markers = undefined
23 @cb = undefined
24 @findStr = ""
25
26 enterFindMode: ->
27 @mode = MODE_FIND
28
29 enterHintsMode: (@markers, @cb) ->
30 @mode = MODE_HINTS
31
32 enterNormalMode: ->
33 @mode = MODE_NORMAL
34 @markers = @cb = undefined
35
36 handleKeyDown: (keyboardEvent, keyStr) ->
37 if @mode == MODE_NORMAL || keyStr == 'Esc'
38 result = maybeCommand @keys.concat([keyStr])
39 else if !keyboardEvent.ctrlKey and !keyboardEvent.metaKey
40 if @mode == MODE_HINTS
41 hintChars = getPref('hint_chars').toLowerCase()
42 result = hintChars.search(regexpEscape(keyStr)) > -1
43 else if @mode == MODE_FIND
44 result = true
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 else if @mode == MODE_FIND
65 findCharHandler @, lastKeyStr, keyboardEvent.charCode
66 result = true
67
68 return result
69
70 findCommand = (keys) ->
71 for i in [0...keys.length]
72 seq = keys.slice(i).join(',')
73 if com = commands[seq]
74 if not isCommandDisabled(seq)
75 return com
76
77 return undefined
78
79 maybeCommand = (keys) ->
80 for i in [0...keys.length]
81 sequence = keys.slice(i).join(',')
82 for seq, com of commands
83 if seq.indexOf(sequence) == 0
84 return not isCommandDisabled(seq)
85
86 return false
87
88 exports.Vim = Vim
Imprint / Impressum