Path: blob/main/src/vs/editor/contrib/caretOperations/browser/transpose.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 { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';6import { ICodeEditor } from '../../../browser/editorBrowser.js';7import { EditorAction, registerEditorAction, ServicesAccessor } from '../../../browser/editorExtensions.js';8import { ReplaceCommand } from '../../../common/commands/replaceCommand.js';9import { MoveOperations } from '../../../common/cursor/cursorMoveOperations.js';10import { Range } from '../../../common/core/range.js';11import { ICommand } from '../../../common/editorCommon.js';12import { EditorContextKeys } from '../../../common/editorContextKeys.js';13import * as nls from '../../../../nls.js';14import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';1516class TransposeLettersAction extends EditorAction {1718constructor() {19super({20id: 'editor.action.transposeLetters',21label: nls.localize2('transposeLetters.label', "Transpose Letters"),22precondition: EditorContextKeys.writable,23kbOpts: {24kbExpr: EditorContextKeys.textInputFocus,25primary: 0,26mac: {27primary: KeyMod.WinCtrl | KeyCode.KeyT28},29weight: KeybindingWeight.EditorContrib30}31});32}3334public run(accessor: ServicesAccessor, editor: ICodeEditor): void {35if (!editor.hasModel()) {36return;37}3839const model = editor.getModel();40const commands: ICommand[] = [];41const selections = editor.getSelections();4243for (const selection of selections) {44if (!selection.isEmpty()) {45continue;46}4748const lineNumber = selection.startLineNumber;49const column = selection.startColumn;5051const lastColumn = model.getLineMaxColumn(lineNumber);5253if (lineNumber === 1 && (column === 1 || (column === 2 && lastColumn === 2))) {54// at beginning of file, nothing to do55continue;56}5758// handle special case: when at end of line, transpose left two chars59// otherwise, transpose left and right chars60const endPosition = (column === lastColumn) ?61selection.getPosition() :62MoveOperations.rightPosition(model, selection.getPosition().lineNumber, selection.getPosition().column);6364const middlePosition = MoveOperations.leftPosition(model, endPosition);65const beginPosition = MoveOperations.leftPosition(model, middlePosition);6667const leftChar = model.getValueInRange(Range.fromPositions(beginPosition, middlePosition));68const rightChar = model.getValueInRange(Range.fromPositions(middlePosition, endPosition));6970const replaceRange = Range.fromPositions(beginPosition, endPosition);71commands.push(new ReplaceCommand(replaceRange, rightChar + leftChar));72}7374if (commands.length > 0) {75editor.pushUndoStop();76editor.executeCommands(this.id, commands);77editor.pushUndoStop();78}79}80}8182registerEditorAction(TransposeLettersAction);838485