diff --git a/spec/atom/editor-spec.coffee b/spec/atom/editor-spec.coffee index 11bb7d71c..93a0b3848 100644 --- a/spec/atom/editor-spec.coffee +++ b/spec/atom/editor-spec.coffee @@ -293,7 +293,7 @@ describe "Editor", -> expect(editor.getCursorPosition()).toEqual(row: 1, column: 7) expect(editor.lines.find('pre:eq(1)')).toHaveText editor.getCurrentLine() - fdescribe "when there is a selection", -> + describe "when there is a selection", -> it "replaces the selected text with the typed text", -> editor.selection.setRange(new Range([1, 6], [2, 4])) editor.hiddenInput.textInput 'q' @@ -367,9 +367,34 @@ describe "Editor", -> editor.setCursorPosition(row: 0, column: 0) editor.trigger keydownEvent('backspace') - fdescribe "when there is a selection", -> + describe "when there is a selection", -> it "deletes the selection, but not the character before it", -> editor.selection.setRange(new Range([0,5], [0,9])) editor.trigger keydownEvent('backspace') expect(editor.buffer.getLine(0)).toBe 'var qsort = function () {' + describe "when delete is pressed", -> + describe "when the cursor is on the middle of a line", -> + it "deletes the character following the cursor", -> + editor.setCursorPosition([1, 6]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(1)).toBe ' var ort = function(items) {' + + describe "when the cursor is on the end of a line", -> + it "joins the line with the following line", -> + editor.setCursorPosition([1, buffer.getLine(1).length]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(1)).toBe ' var sort = function(items) { if (items.length <= 1) return items;' + + describe "when there is a selection", -> + it "deletes the selection, but not the character following it", -> + editor.selection.setRange(new Range([1,6], [1,8])) + editor.trigger keydownEvent 'delete' + expect(buffer.getLine(1)).toBe ' var rt = function(items) {' + + describe "when the cursor is on the last column of the last line", -> + it "does nothing, but doesn't raise an error", -> + editor.setCursorPosition([12, buffer.getLine(12).length]) + editor.trigger keydownEvent('delete') + expect(buffer.getLine(12)).toBe '};' + diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index c71d584fe..91085388e 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -39,6 +39,7 @@ class Editor extends Template 'shift-down': 'select-down' enter: 'newline' backspace: 'backspace' + delete: 'delete' @on 'move-right', => @moveCursorRight() @on 'move-left', => @moveCursorLeft() @@ -50,6 +51,7 @@ class Editor extends Template @on 'select-down', => @selectDown() @on 'newline', => @insertNewline() @on 'backspace', => @backspace() + @on 'delete', => @delete() buildCursorAndSelection: -> @@ -158,4 +160,5 @@ class Editor extends Template insertText: (text) -> @selection.insertText(text) insertNewline: -> @selection.insertNewline() backspace: -> @selection.backspace() + delete: -> @selection.delete() diff --git a/src/atom/selection.coffee b/src/atom/selection.coffee index 897c180e3..a3068bf94 100644 --- a/src/atom/selection.coffee +++ b/src/atom/selection.coffee @@ -90,13 +90,26 @@ class Selection extends Template if range.isEmpty() if range.start.column == 0 return if range.start.row == 0 - range.start.column = @editor.buffer.lines[range.start.row - 1].length + range.start.column = @editor.buffer.getLine(range.start.row - 1).length range.start.row-- else range.start.column-- @editor.buffer.change(range, '') + delete: -> + range = @getRange() + + if range.isEmpty() + if range.end.column == @editor.buffer.getLine(range.end.row).length + return if range.end.row == @editor.buffer.numLines() - 1 + range.end.column = 0 + range.end.row++ + else + range.end.column++ + + @editor.buffer.change(range, '') + isEmpty: -> @getRange().isEmpty()