Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
alexdima authored and leilapearson committed Apr 27, 2020
1 parent 0e6f4de commit e8b7a0e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/vs/editor/common/commands/shiftCommand.ts
Expand Up @@ -103,14 +103,14 @@ export class ShiftCommand implements ICommand {
const { tabSize, indentSize, insertSpaces } = this._opts;
const shouldIndentEmptyLines = (startLine === endLine);

// if indenting or outdenting on a whitespace only line
if (this._selection.isEmpty()) {
if (/^\s*$/.test(model.getLineContent(startLine))) {
this._useLastEditRangeForCursorEndPosition = true;
if (this._opts.useTabStops) {
// if indenting or outdenting on a whitespace only line
if (this._selection.isEmpty()) {
if (/^\s*$/.test(model.getLineContent(startLine))) {
this._useLastEditRangeForCursorEndPosition = true;
}
}
}

if (this._opts.useTabStops) {
// keep track of previous line's "miss-alignment"
let previousLineExtraSpaces = 0, extraSpaces = 0;
for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++, previousLineExtraSpaces = extraSpaces) {
Expand Down Expand Up @@ -188,6 +188,11 @@ export class ShiftCommand implements ICommand {
}
} else {

// if indenting or outdenting on a whitespace only line
if (!this._opts.isUnshift && this._selection.isEmpty() && model.getLineLength(startLine) === 0) {
this._useLastEditRangeForCursorEndPosition = true;
}

const oneIndent = (insertSpaces ? cachedStringRepeat(' ', indentSize) : '\t');

for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++) {
Expand Down
19 changes: 19 additions & 0 deletions src/vs/editor/contrib/linesOperations/test/linesOperations.test.ts
Expand Up @@ -960,6 +960,25 @@ suite('Editor Contrib - Line Operations', () => {
model.dispose();
});

test('Indenting on empty line should move cursor', () => {
const model = createTextModel(
[
''
].join('\n')
);

withTestCodeEditor(null, { model: model, useTabStops: false }, (editor) => {
const indentLinesAction = new IndentLinesAction();
editor.setPosition(new Position(1, 1));

executeAction(indentLinesAction, editor);
assert.equal(model.getLineContent(1), ' ');
assert.deepEqual(editor.getSelection(), new Selection(1, 5, 1, 5));
});

model.dispose();
});

test('issue #62112: Delete line does not work properly when multiple cursors are on line', () => {
const TEXT = [
'a',
Expand Down
22 changes: 22 additions & 0 deletions src/vs/editor/test/browser/controller/cursor.test.ts
Expand Up @@ -1428,6 +1428,28 @@ suite('Editor Controller - Regression tests', () => {
model.dispose();
});

test('issue #95591: Unindenting moves cursor to beginning of line', () => {
let model = createTextModel(
[
' '
].join('\n')
);

withTestCodeEditor(null, {
model: model,
useTabStops: false
}, (editor, cursor) => {
moveTo(cursor, 1, 9, false);
assertCursor(cursor, new Selection(1, 9, 1, 9));

CoreEditingCommands.Outdent.runEditorCommand(null, editor, null);
assert.equal(model.getLineContent(1), ' ');
assertCursor(cursor, new Selection(1, 5, 1, 5));
});

model.dispose();
});

test('Bug #16657: [editor] Tab on empty line of zero indentation moves cursor to position (1,1)', () => {
let model = createTextModel(
[
Expand Down

0 comments on commit e8b7a0e

Please sign in to comment.