diff --git a/spec/atom/vim-mode-spec.coffee b/spec/atom/vim-mode-spec.coffee index 41baa3cdc..5a0350acc 100644 --- a/spec/atom/vim-mode-spec.coffee +++ b/spec/atom/vim-mode-spec.coffee @@ -57,6 +57,18 @@ describe "VimMode", -> expect(editor.buffer.getText()).toBe "12345\nABCDE" expect(editor.getPosition()).toEqual(column: 0, row: 1) + describe "when the second d is prefixed by a count", -> + it "deletes n lines, starting from the current", -> + editor.buffer.setText("12345\nabcde\nABCDE\nQWERT") + editor.setPosition(column: 1, row: 1) + + editor.trigger keydownEvent('d') + editor.trigger keydownEvent('2') + editor.trigger keydownEvent('d') + + expect(editor.buffer.getText()).toBe "12345\nQWERT" + expect(editor.getPosition()).toEqual(column: 0, row: 1) + describe "when followed by an h", -> it "deletes the previous letter on the current line", -> editor.buffer.setText("abcd\n01234") diff --git a/src/atom/vim-mode.coffee b/src/atom/vim-mode.coffee index 000404e50..09a9b1dba 100644 --- a/src/atom/vim-mode.coffee +++ b/src/atom/vim-mode.coffee @@ -74,11 +74,16 @@ class VimMode @pushOperator(new operators.NumericPrefix(num)) delete: () -> - if @topOperator() instanceof operators.Delete - @pushOperator(new motions.SelectLine(@editor)) + if @isDeletePending() + @pushOperator(new motions.SelectLines(@editor)) else @pushOperator(new operators.Delete(@editor)) + isDeletePending: () -> + for op in @opStack + return true if op instanceof operators.Delete + false + pushOperator: (op) -> @opStack.push(op) @processOpStack() diff --git a/src/atom/vim-mode/motions.coffee b/src/atom/vim-mode/motions.coffee index 8fba701bd..b03de1257 100644 --- a/src/atom/vim-mode/motions.coffee +++ b/src/atom/vim-mode/motions.coffee @@ -47,9 +47,17 @@ class MoveToNextWord extends Motion column = nextLineMatch?.index or 0 { row, column } -class SelectLine extends Motion +class SelectLines extends Motion + count: null + + constructor: (@editor) -> + @count = 1 + + setCount: (@count) -> + select: -> - @editor.selectLine() + @editor.setPosition(column: 0, row: @editor.getRow()) + @editor.selectToPosition(column: 0, row: @editor.getRow() + @count) -module.exports = { MoveLeft, MoveUp, MoveDown, MoveToNextWord, SelectLine } +module.exports = { MoveLeft, MoveUp, MoveDown, MoveToNextWord, SelectLines } diff --git a/src/atom/vim-mode/operators.coffee b/src/atom/vim-mode/operators.coffee index 64f442be3..080e194b4 100644 --- a/src/atom/vim-mode/operators.coffee +++ b/src/atom/vim-mode/operators.coffee @@ -12,6 +12,9 @@ class NumericPrefix compose: (@operatorToRepeat) -> @complete = true + if @operatorToRepeat.setCount? + @operatorToRepeat.setCount @count + @count = 1 addDigit: (digit) -> @count = @count * 10 + digit