diff --git a/spec/atom/vim-mode-spec.coffee b/spec/atom/vim-mode-spec.coffee index 1010a9da6..6c20bd508 100644 --- a/spec/atom/vim-mode-spec.coffee +++ b/spec/atom/vim-mode-spec.coffee @@ -77,6 +77,15 @@ describe "VimMode", -> editor.trigger keydownEvent('j') expect(editor.getCursor()).toEqual(column: 1, row: 0) + describe "the w keybinding", -> + it "moves the cursor to the beginning of the next word", -> + editor.buffer.setText("ab cde 123+- \n xyz") + editor.setCursor(column: 0, row: 0) + + editor.trigger keydownEvent('w') + expect(editor.getCursor()).toEqual(column: 3, row: 0) + + describe "numeric prefix bindings", -> it "repeats the following operation N times", -> editor.buffer.setText("12345") diff --git a/src/atom/buffer.coffee b/src/atom/buffer.coffee index 97ef12441..b334a85c4 100644 --- a/src/atom/buffer.coffee +++ b/src/atom/buffer.coffee @@ -41,3 +41,7 @@ class Buffer save: -> if not @url then throw new Error("Tried to save buffer with no url") fs.write @url, @getText() + + getLine: (row) -> + @aceDocument.getLine(row) + diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index 9ddacc090..27bc6b772 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -56,11 +56,18 @@ class Editor extends Template @buffer.save() setCursor: ({column, row}) -> - @aceEditor.moveCursorToPosition({column, row}) + @aceEditor.navigateTo(row, column) getCursor: -> @getAceSession().getSelection().getCursor() + getLineText: -> + @buffer.getLine(@getRow()) + + getRow: -> + { row } = @getCursor() + row + deleteChar: -> @aceEditor.remove 'right' diff --git a/src/atom/vim-mode-operators.coffee b/src/atom/vim-mode-operators.coffee index 386f9b762..cb8c5b5c1 100644 --- a/src/atom/vim-mode-operators.coffee +++ b/src/atom/vim-mode-operators.coffee @@ -1,5 +1,7 @@ _ = require 'underscore' +getWordRegex = -> /(\w+)|([^\w\s]+)/g + module.exports = NumericPrefix: class count: null @@ -48,3 +50,18 @@ module.exports = isComplete: -> true + MoveToNextWord: class + execute: (editor) -> + regex = getWordRegex() + { row, column } = editor.getCursor() + rightOfCursor = editor.getLineText().substring(column) + + match = regex.exec(rightOfCursor) + # If we're on top of part of a word, match the next one. + match = regex.exec(rightOfCursor) if match?.index is 0 + column += match.index + + editor.setCursor { row, column } + + isComplete: -> true + diff --git a/src/atom/vim-mode.coffee b/src/atom/vim-mode.coffee index cfb37b045..8d10267f7 100644 --- a/src/atom/vim-mode.coffee +++ b/src/atom/vim-mode.coffee @@ -29,6 +29,7 @@ class VimMode 'x': 'delete-char' 'h': 'move-left' 'j': 'move-up' + 'w': 'move-to-next-word' @handleCommands 'insert': => @activateInsertMode() @@ -36,6 +37,7 @@ class VimMode 'delete-char': => new op.DeleteChar 'move-left': => new op.MoveLeft 'move-up': => new op.MoveUp + 'move-to-next-word': => new op.MoveToNextWord 'numeric-prefix': (e) => @numericPrefix(e) bindCommandModeKeys: (bindings) ->