aboutsummaryrefslogtreecommitdiff
path: root/atom/packages/ex-mode/lib/ex-state.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'atom/packages/ex-mode/lib/ex-state.coffee')
-rw-r--r--atom/packages/ex-mode/lib/ex-state.coffee59
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