1 utils = require 'utils'
2 { modes } = require 'modes'
4 , isReturnCommandKey } = require 'commands'
7 constructor: (@window) ->
11 enterMode: (mode, args) ->
12 # `args` is an array of arguments to be passed to the mode's `onEnter` method
14 throw new Error("Not a valid VimFx mode to enter: #{ mode }")
18 modes[@mode].onLeave(@, @storage[@mode], args)
22 modes[@mode].onEnter(@, @storage[@mode] ?= {}, args)
24 onInput: (keyStr, event) ->
25 isEditable = utils.isElementEditable(event.originalTarget)
27 if isEditable and not (isEscCommandKey(keyStr) or isReturnCommandKey(keyStr))
32 suppress = modes[@mode]?.onInput(@, @storage[@mode], keyStr, event)
34 # Esc key is not suppressed, and passed to the browser in `normal` mode.
35 # Here we compare against the mode that was active before the key was
36 # processed because processing the command may change the mode.
38 # Not suppressing Esc allows for stopping the loading of the page as well as
39 # closing many custom dialogs (and perhaps other things -- Esc is a very
40 # commonly used key). There are two reasons we might suppress it in other
41 # modes. If some custom dialog of a website is open, we should be able to
42 # cancel hint markers on it without closing it. Secondly, otherwise
43 # cancelling hint markers on google causes its search bar to be focused.
44 if oldMode == 'normal' and keyStr == 'Esc'