Path: blob/main/src/vs/editor/contrib/caretOperations/browser/moveCaretCommand.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Range } from '../../../common/core/range.js';6import { Selection } from '../../../common/core/selection.js';7import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from '../../../common/editorCommon.js';8import { ITextModel } from '../../../common/model.js';910export class MoveCaretCommand implements ICommand {1112private readonly _selection: Selection;13private readonly _isMovingLeft: boolean;1415constructor(selection: Selection, isMovingLeft: boolean) {16this._selection = selection;17this._isMovingLeft = isMovingLeft;18}1920public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {21if (this._selection.startLineNumber !== this._selection.endLineNumber || this._selection.isEmpty()) {22return;23}24const lineNumber = this._selection.startLineNumber;25const startColumn = this._selection.startColumn;26const endColumn = this._selection.endColumn;27if (this._isMovingLeft && startColumn === 1) {28return;29}30if (!this._isMovingLeft && endColumn === model.getLineMaxColumn(lineNumber)) {31return;32}3334if (this._isMovingLeft) {35const rangeBefore = new Range(lineNumber, startColumn - 1, lineNumber, startColumn);36const charBefore = model.getValueInRange(rangeBefore);37builder.addEditOperation(rangeBefore, null);38builder.addEditOperation(new Range(lineNumber, endColumn, lineNumber, endColumn), charBefore);39} else {40const rangeAfter = new Range(lineNumber, endColumn, lineNumber, endColumn + 1);41const charAfter = model.getValueInRange(rangeAfter);42builder.addEditOperation(rangeAfter, null);43builder.addEditOperation(new Range(lineNumber, startColumn, lineNumber, startColumn), charAfter);44}45}4647public computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection {48if (this._isMovingLeft) {49return new Selection(this._selection.startLineNumber, this._selection.startColumn - 1, this._selection.endLineNumber, this._selection.endColumn - 1);50} else {51return new Selection(this._selection.startLineNumber, this._selection.startColumn + 1, this._selection.endLineNumber, this._selection.endColumn + 1);52}53}54}555657