Fixes #15401: home and end have special behaviours when leaving selection mode

This commit is contained in:
Alex Dima 2016-12-02 16:40:07 +01:00
parent eebf4c7b3c
commit 9377376eb4
2 changed files with 47 additions and 14 deletions

View file

@ -242,31 +242,50 @@ export class MoveOperations {
}
public static moveToBeginningOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleMoveOperationResult {
let lineNumber = cursor.position.lineNumber;
let column = cursor.position.column;
let lineNumber: number;
let column: number;
if (cursor.hasSelection() && !inSelectionMode) {
// If we are in selection mode, home goes to the beginning of selection
lineNumber = cursor.selection.startLineNumber;
column = cursor.selection.startColumn;
} else {
lineNumber = cursor.position.lineNumber;
let firstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(lineNumber) || 1;
let minColumn = model.getLineMinColumn(lineNumber);
if (column !== minColumn && column <= firstNonBlankColumn) {
if (cursor.position.column !== minColumn && cursor.position.column <= firstNonBlankColumn) {
column = minColumn;
} else {
column = firstNonBlankColumn;
}
}
return SingleMoveOperationResult.fromMove(cursor, inSelectionMode, lineNumber, column, 0, true, CursorChangeReason.Explicit);
}
public static moveToEndOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleMoveOperationResult {
let lineNumber = cursor.position.lineNumber;
let column = cursor.position.column;
let lineNumber: number;
let column: number;
if (cursor.hasSelection() && !inSelectionMode) {
// If we are in selection mode, end goes to the end of selection
lineNumber = cursor.selection.endLineNumber;
column = cursor.selection.endColumn;
} else {
lineNumber = cursor.position.lineNumber;
let maxColumn = model.getLineMaxColumn(lineNumber);
let lastNonBlankColumn = model.getLineLastNonWhitespaceColumn(lineNumber) || maxColumn;
if (column !== maxColumn && column >= lastNonBlankColumn) {
column = cursor.position.column;
if (cursor.position.column !== maxColumn && cursor.position.column >= lastNonBlankColumn) {
column = maxColumn;
} else {
column = lastNonBlankColumn;
}
}
return SingleMoveOperationResult.fromMove(cursor, inSelectionMode, lineNumber, column, 0, true, CursorChangeReason.Explicit);
}

View file

@ -487,6 +487,13 @@ suite('Editor Controller - Cursor', () => {
assertCursor(thisCursor, new Selection(1, 8, 1, 1));
});
test('issue #15401: "End" key is behaving weird when text is selected part 1', () => {
moveTo(thisCursor, 1, 2);
moveTo(thisCursor, 3, 9, true);
moveToBeginningOfLine(thisCursor, false);
assertCursor(thisCursor, new Selection(1, 2, 1, 2));
});
// --------- move to end of line
test('move to end of line', () => {
@ -520,6 +527,13 @@ suite('Editor Controller - Cursor', () => {
assertCursor(thisCursor, new Selection(1, 6, 1, LINE1.length + 1));
});
test('issue #15401: "End" key is behaving weird when text is selected part 2', () => {
moveTo(thisCursor, 1, 1);
moveTo(thisCursor, 3, 9, true);
moveToEndOfLine(thisCursor, false);
assertCursor(thisCursor, new Selection(3, 9, 3, 9));
});
// --------- move to beginning of buffer
test('move to beginning of buffer', () => {