diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 9ca3025de5b1a7d2c73a313cbb5e7737373f4eaa..82f07456fd77e84fcf4936e43705c5feced9ce37 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -424,8 +424,13 @@ export class DeleteAllRightAction extends EditorAction { let rangesToDelete: Range[] = editor.getSelections().map((sel) => { if (sel.isEmpty()) { - let maxColumn = model.getLineMaxColumn(sel.startLineNumber); - return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber, maxColumn); + const maxColumn = model.getLineMaxColumn(sel.startLineNumber); + + if (sel.startColumn === maxColumn) { + return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber + 1, 1); + } else { + return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber, maxColumn); + } } return sel; }); @@ -453,6 +458,7 @@ export class DeleteAllRightAction extends EditorAction { }); editor.executeEdits(this.id, edits); + editor.pushUndoStop(); } } diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index 161f0b24e0a54394b3c6357d61f7fa09d737c5cf..04c8207ea22f854534206fafa7f14d0eec6f9439 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; +import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; suite('Editor Contrib - Line Operations', () => { test('delete all left', function () { @@ -306,4 +306,146 @@ suite('Editor Contrib - Line Operations', () => { } ); }); + + suite('DeleteAllRightAction', () => { + test('should be noop on empty', () => { + withMockCodeEditor([''], {}, (editor, cursor) => { + const model = editor.getModel(); + const action = new DeleteAllRightAction(); + + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 1, 1, 1)]); + + editor.setSelection(new Selection(1, 1, 1, 1)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 1, 1, 1)]); + + editor.setSelections([new Selection(1, 1, 1, 1), new Selection(1, 1, 1, 1), new Selection(1, 1, 1, 1)]); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 1, 1, 1)]); + }); + }); + + test('should delete selected range', () => { + withMockCodeEditor([ + 'hello', + 'world' + ], {}, (editor, cursor) => { + const model = editor.getModel(); + const action = new DeleteAllRightAction(); + + editor.setSelection(new Selection(1, 2, 1, 5)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['ho', 'world']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 2, 1, 2)]); + + editor.setSelection(new Selection(1, 1, 2, 4)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['ld']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 1, 1, 1)]); + + editor.setSelection(new Selection(1, 1, 1, 3)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 1, 1, 1)]); + }); + }); + + test('should delete to the right of the cursor', () => { + withMockCodeEditor([ + 'hello', + 'world' + ], {}, (editor, cursor) => { + const model = editor.getModel(); + const action = new DeleteAllRightAction(); + + editor.setSelection(new Selection(1, 3, 1, 3)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['he', 'world']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 3, 1, 3)]); + + editor.setSelection(new Selection(2, 1, 2, 1)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['he', '']); + assert.deepEqual(editor.getSelections(), [new Selection(2, 1, 2, 1)]); + }); + }); + + test('should join two lines, if at the end of the line', () => { + withMockCodeEditor([ + 'hello', + 'world' + ], {}, (editor, cursor) => { + const model = editor.getModel(); + const action = new DeleteAllRightAction(); + + editor.setSelection(new Selection(1, 6, 1, 6)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['helloworld']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 6, 1, 6)]); + + editor.setSelection(new Selection(1, 6, 1, 6)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['hello']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 6, 1, 6)]); + + editor.setSelection(new Selection(1, 6, 1, 6)); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['hello']); + assert.deepEqual(editor.getSelections(), [new Selection(1, 6, 1, 6)]); + }); + }); + + test('should work with multiple cursors', () => { + withMockCodeEditor([ + 'hello', + 'there', + 'world' + ], {}, (editor, cursor) => { + const model = editor.getModel(); + const action = new DeleteAllRightAction(); + + editor.setSelections([ + new Selection(1, 3, 1, 3), + new Selection(1, 6, 1, 6), + new Selection(3, 4, 3, 4), + ]); + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['hethere', 'wor']); + assert.deepEqual(editor.getSelections(), [ + new Selection(1, 3, 1, 3), + new Selection(2, 4, 2, 4) + ]); + + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['he', 'wor']); + assert.deepEqual(editor.getSelections(), [ + new Selection(1, 3, 1, 3), + new Selection(2, 4, 2, 4) + ]); + + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['hewor']); + assert.deepEqual(editor.getSelections(), [ + new Selection(1, 3, 1, 3), + new Selection(1, 6, 1, 6) + ]); + + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['he']); + assert.deepEqual(editor.getSelections(), [ + new Selection(1, 3, 1, 3) + ]); + + action.run(null, editor); + assert.deepEqual(model.getLinesContent(), ['he']); + assert.deepEqual(editor.getSelections(), [ + new Selection(1, 3, 1, 3) + ]); + }); + }); + }); }); \ No newline at end of file