From a647fa4220fa7b5d5108f8057aa14933b4b94466 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 23 Jan 2012 11:37:00 -0800 Subject: [PATCH] Implement d3d Delete line can take a count before the second d. When the second d is typed it pushed a SelectLines operation. When a numeric prefix is composed with SelectLines, it assigns its count on select lines, which uses it to determine how many lines to select. This bypasses the normal "repeat command" semantics of numeric prefix. --- spec/atom/vim-mode-spec.coffee | 12 ++++++++++++ src/atom/vim-mode.coffee | 9 +++++++-- src/atom/vim-mode/motions.coffee | 14 +++++++++++--- src/atom/vim-mode/operators.coffee | 3 +++ 4 files changed, 33 insertions(+), 5 deletions(-) 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