diff --git a/spec/atom/editor-spec.coffee b/spec/atom/editor-spec.coffee index 0adf9b533..3d5433af1 100644 --- a/spec/atom/editor-spec.coffee +++ b/spec/atom/editor-spec.coffee @@ -23,6 +23,13 @@ describe "Editor", -> it "has a buffer", -> expect(editor.buffer).toBeDefined() + fdescribe '.set/getCursor', -> + it "moves the cursor", -> + editor.buffer.setText("012345") + expect(editor.getCursor()).toEqual {column: 6, row: 0} + editor.setCursor(column: 2, row: 0) + expect(editor.getCursor()).toEqual {column: 2, row: 0} + describe 'destroy', -> it 'destroys the ace editor', -> spyOn(editor.aceEditor, 'destroy').andCallThrough() diff --git a/spec/atom/vim-mode-spec.coffee b/spec/atom/vim-mode-spec.coffee new file mode 100644 index 000000000..c6f12ce98 --- /dev/null +++ b/spec/atom/vim-mode-spec.coffee @@ -0,0 +1,46 @@ +Editor = require 'editor' +VimMode = require 'vim-mode' + +describe "VimMode", -> + editor = null + + beforeEach -> + editor = Editor.build() + editor.enableKeymap() + vimMode = new VimMode(editor) + + describe "initialize", -> + it "puts the editor in command-mode initially", -> + expect(editor).toHaveClass 'command-mode' + + describe "command-mode", -> + describe "the i keybinding", -> + it "puts the editor into insert mode", -> + expect(editor).not.toHaveClass 'insert-mode' + + editor.trigger keydownEvent('i') + + expect(editor).toHaveClass 'insert-mode' + expect(editor).not.toHaveClass 'command-mode' + + fdescribe "the x keybinding", -> + it "deletes a charachter", -> + editor.buffer.setText("12345") + editor.setCursor(column: 1, row: 0) + + editor.trigger keydownEvent('x') + + expect(editor.buffer.getText()).toBe '1345' + expect(editor.getCursor()).toEqual(column: 1, row: 0) + + describe "insert-mode", -> + beforeEach -> + editor.trigger keydownEvent('i') + + it "puts the editor into command mode when is pressed", -> + expect(editor).not.toHaveClass 'command-mode' + + editor.trigger keydownEvent('') + + expect(editor).toHaveClass 'command-mode' + expect(editor).not.toHaveClass 'insert-mode' diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index 7bae90f3a..d93a45e8b 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -55,3 +55,14 @@ class Editor extends Template @buffer.url = url @buffer.save() + setCursor: ({column, row}) -> + @aceEditor.moveCursorToPosition({column, row}) + + getCursor: -> + @getAceSession().getSelection().getCursor() + + delete: -> + @aceEditor.remove 'right' + + + diff --git a/src/atom/root-view.coffee b/src/atom/root-view.coffee index c0704cc2f..65c5543f1 100644 --- a/src/atom/root-view.coffee +++ b/src/atom/root-view.coffee @@ -8,6 +8,7 @@ Editor = require 'editor' FileFinder = require 'file-finder' Project = require 'project' GlobalKeymap = require 'global-keymap' +VimMode = require 'vim-mode' module.exports = class RootView extends Template @@ -22,6 +23,7 @@ class RootView extends Template globalKeymap: null initialize: ({url}) -> + new VimMode(@editor) @editor.keyEventHandler = atom.globalKeymap @createProject(url) diff --git a/src/atom/vim-mode.coffee b/src/atom/vim-mode.coffee new file mode 100644 index 000000000..e01df66cd --- /dev/null +++ b/src/atom/vim-mode.coffee @@ -0,0 +1,28 @@ +module.exports = +class VimMode + editor: null + + constructor: (@editor) -> + atom.bindKeys '.command-mode' + 'i': 'insert-mode:activate' + 'x': 'command-mode:delete' + + atom.bindKeys '.insert-mode' + '': 'command-mode:activate' + + @editor.addClass('command-mode') + + @editor.on 'insert-mode:activate', => @activateInsertMode() + @editor.on 'command-mode:activate', => @activateCommandMode() + @editor.on 'command-mode:delete', => @delete() + + activateInsertMode: -> + @editor.removeClass('command-mode') + @editor.addClass('insert-mode') + + activateCommandMode: -> + @editor.removeClass('insert-mode') + @editor.addClass('command-mode') + + delete: -> + @editor.delete()