From 7cdcf2b35820757276e98703861d134d73818652 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 3 Feb 2012 17:31:39 -0800 Subject: [PATCH] When dd is called on the last line, it removes the \n from the previous line Treat dd as a special, completing version of d. --- spec/atom/vim-mode-spec.coffee | 11 +++++++++-- src/atom/buffer.coffee | 14 ++++++++++++++ src/atom/vim-mode.coffee | 7 ++++--- src/atom/vim-mode/operators.coffee | 3 ++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/spec/atom/vim-mode-spec.coffee b/spec/atom/vim-mode-spec.coffee index 66359b934..cf5f6f8f9 100644 --- a/spec/atom/vim-mode-spec.coffee +++ b/spec/atom/vim-mode-spec.coffee @@ -53,11 +53,18 @@ describe "VimMode", -> editor.trigger keydownEvent('d') editor.trigger keydownEvent('d') - expect(editor.buffer.getText()).toBe "12345\nABCDE" expect(editor.getCursorPosition()).toEqual([1,0]) - describe "when the second d is prefixed by a count", -> + it "deletes the last line", -> + editor.buffer.setText("12345\nabcde\nABCDE") + editor.setCursorPosition([2,1]) + editor.trigger keydownEvent('d') + editor.trigger keydownEvent('d') + expect(editor.buffer.getText()).toBe "12345\nabcde" + expect(editor.getCursorPosition()).toEqual([1,0]) + + xdescribe "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.setCursorPosition([1,1]) diff --git a/src/atom/buffer.coffee b/src/atom/buffer.coffee index 661f82cce..98575ef81 100644 --- a/src/atom/buffer.coffee +++ b/src/atom/buffer.coffee @@ -41,6 +41,9 @@ class Buffer getLine: (row) -> @lines[row] + getLineLength: (row) -> + @lines[row].length + numLines: -> @getLines().length @@ -50,6 +53,17 @@ class Buffer lastLine: -> @getLine(@lastRow()) + deleteRow: (row) -> + range = null + if row == @lastRow() + range = new Range([row - 1, @getLineLength(row - 1)], [row, @getLineLength(row)]) + else + range = new Range([row, 0], [row + 1, 0]) + + console.log range + + @change(range, '') + insert: (point, text) -> @change(new Range(point, point), text) diff --git a/src/atom/vim-mode.coffee b/src/atom/vim-mode.coffee index acca2c2e5..a1073e7ae 100644 --- a/src/atom/vim-mode.coffee +++ b/src/atom/vim-mode.coffee @@ -78,14 +78,15 @@ class VimMode @pushOperator(new operators.NumericPrefix(num)) delete: () -> - if @isDeletePending() - @pushOperator(new motions.SelectLines(@editor)) + if deleteOperation = @isDeletePending() + deleteOperation.complete = true + @processOpStack() else @pushOperator(new operators.Delete(@editor)) isDeletePending: () -> for op in @opStack - return true if op instanceof operators.Delete + return op if op instanceof operators.Delete false pushOperator: (op) -> diff --git a/src/atom/vim-mode/operators.coffee b/src/atom/vim-mode/operators.coffee index 6d06b8ab9..10aeb26f1 100644 --- a/src/atom/vim-mode/operators.coffee +++ b/src/atom/vim-mode/operators.coffee @@ -39,7 +39,8 @@ class Delete @motion.select() @editor.getSelection().delete() else - @editor.deleteLine() + @editor.buffer.deleteRow(@editor.getCursorRow()) + @editor.setCursorPosition([@editor.getCursorRow(), 0]) compose: (motion) -> @motion = motion