]>
Commit | Line | Data |
---|---|---|
1 | {Emitter, Disposable, CompositeDisposable} = require 'event-kit' | |
2 | ||
3 | Command = require './command' | |
4 | CommandError = require './command-error' | |
5 | ||
6 | class ExState | |
7 | constructor: (@editorElement, @globalExState) -> | |
8 | @emitter = new Emitter | |
9 | @subscriptions = new CompositeDisposable | |
10 | @editor = @editorElement.getModel() | |
11 | @opStack = [] | |
12 | @history = [] | |
13 | ||
14 | @registerOperationCommands | |
15 | open: (e) => new Command(@editor, @) | |
16 | ||
17 | destroy: -> | |
18 | @subscriptions.dispose() | |
19 | ||
20 | getExHistoryItem: (index) -> | |
21 | @globalExState.commandHistory[index] | |
22 | ||
23 | pushExHistory: (command) -> | |
24 | @globalExState.commandHistory.unshift command | |
25 | ||
26 | registerOperationCommands: (commands) -> | |
27 | for commandName, fn of commands | |
28 | do (fn) => | |
29 | pushFn = (e) => @pushOperations(fn(e)) | |
30 | @subscriptions.add( | |
31 | atom.commands.add(@editorElement, "ex-mode:#{commandName}", pushFn) | |
32 | ) | |
33 | ||
34 | onDidFailToExecute: (fn) -> | |
35 | @emitter.on('failed-to-execute', fn) | |
36 | ||
37 | onDidProcessOpStack: (fn) -> | |
38 | @emitter.on('processed-op-stack', fn) | |
39 | ||
40 | pushOperations: (operations) -> | |
41 | @opStack.push operations | |
42 | ||
43 | @processOpStack() if @opStack.length == 2 | |
44 | ||
45 | clearOpStack: -> | |
46 | @opStack = [] | |
47 | ||
48 | processOpStack: -> | |
49 | [command, input] = @opStack | |
50 | if input.characters.length > 0 | |
51 | @history.unshift command | |
52 | try | |
53 | command.execute(input) | |
54 | catch e | |
55 | if (e instanceof CommandError) | |
56 | atom.notifications.addError("Command error: #{e.message}") | |
57 | @emitter.emit('failed-to-execute') | |
58 | else | |
59 | throw e | |
60 | @clearOpStack() | |
61 | @emitter.emit('processed-op-stack') | |
62 | ||
63 | module.exports = ExState |