diff options
Diffstat (limited to 'atom/packages/ex-mode/lib/ex-state.coffee')
| -rw-r--r-- | atom/packages/ex-mode/lib/ex-state.coffee | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/atom/packages/ex-mode/lib/ex-state.coffee b/atom/packages/ex-mode/lib/ex-state.coffee new file mode 100644 index 0000000..b676535 --- /dev/null +++ b/atom/packages/ex-mode/lib/ex-state.coffee @@ -0,0 +1,59 @@ +{Emitter, Disposable, CompositeDisposable} = require 'event-kit' + +Command = require './command' +CommandError = require './command-error' + +class ExState + constructor: (@editorElement, @globalExState) -> + @emitter = new Emitter + @subscriptions = new CompositeDisposable + @editor = @editorElement.getModel() + @opStack = [] + @history = [] + + @registerOperationCommands + open: (e) => new Command(@editor, @) + + destroy: -> + @subscriptions.dispose() + + getExHistoryItem: (index) -> + @globalExState.commandHistory[index] + + pushExHistory: (command) -> + @globalExState.commandHistory.unshift command + + registerOperationCommands: (commands) -> + for commandName, fn of commands + do (fn) => + pushFn = (e) => @pushOperations(fn(e)) + @subscriptions.add( + atom.commands.add(@editorElement, "ex-mode:#{commandName}", pushFn) + ) + + onDidFailToExecute: (fn) -> + @emitter.on('failed-to-execute', fn) + + pushOperations: (operations) -> + @opStack.push operations + + @processOpStack() if @opStack.length == 2 + + clearOpStack: -> + @opStack = [] + + processOpStack: -> + [command, input] = @opStack + if input.characters.length > 0 + @history.unshift command + try + command.execute(input) + catch e + if (e instanceof CommandError) + atom.notifications.addError("Command error: #{e.message}") + @emitter.emit('failed-to-execute') + else + throw e + @clearOpStack() + +module.exports = ExState |