Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/caretOperations/browser/transpose.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
7
import { ICodeEditor } from '../../../browser/editorBrowser.js';
8
import { EditorAction, registerEditorAction, ServicesAccessor } from '../../../browser/editorExtensions.js';
9
import { ReplaceCommand } from '../../../common/commands/replaceCommand.js';
10
import { MoveOperations } from '../../../common/cursor/cursorMoveOperations.js';
11
import { Range } from '../../../common/core/range.js';
12
import { ICommand } from '../../../common/editorCommon.js';
13
import { EditorContextKeys } from '../../../common/editorContextKeys.js';
14
import * as nls from '../../../../nls.js';
15
import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
16
17
class TransposeLettersAction extends EditorAction {
18
19
constructor() {
20
super({
21
id: 'editor.action.transposeLetters',
22
label: nls.localize2('transposeLetters.label', "Transpose Letters"),
23
precondition: EditorContextKeys.writable,
24
kbOpts: {
25
kbExpr: EditorContextKeys.textInputFocus,
26
primary: 0,
27
mac: {
28
primary: KeyMod.WinCtrl | KeyCode.KeyT
29
},
30
weight: KeybindingWeight.EditorContrib
31
}
32
});
33
}
34
35
public run(accessor: ServicesAccessor, editor: ICodeEditor): void {
36
if (!editor.hasModel()) {
37
return;
38
}
39
40
const model = editor.getModel();
41
const commands: ICommand[] = [];
42
const selections = editor.getSelections();
43
44
for (const selection of selections) {
45
if (!selection.isEmpty()) {
46
continue;
47
}
48
49
const lineNumber = selection.startLineNumber;
50
const column = selection.startColumn;
51
52
const lastColumn = model.getLineMaxColumn(lineNumber);
53
54
if (lineNumber === 1 && (column === 1 || (column === 2 && lastColumn === 2))) {
55
// at beginning of file, nothing to do
56
continue;
57
}
58
59
// handle special case: when at end of line, transpose left two chars
60
// otherwise, transpose left and right chars
61
const endPosition = (column === lastColumn) ?
62
selection.getPosition() :
63
MoveOperations.rightPosition(model, selection.getPosition().lineNumber, selection.getPosition().column);
64
65
const middlePosition = MoveOperations.leftPosition(model, endPosition);
66
const beginPosition = MoveOperations.leftPosition(model, middlePosition);
67
68
const leftChar = model.getValueInRange(Range.fromPositions(beginPosition, middlePosition));
69
const rightChar = model.getValueInRange(Range.fromPositions(middlePosition, endPosition));
70
71
const replaceRange = Range.fromPositions(beginPosition, endPosition);
72
commands.push(new ReplaceCommand(replaceRange, rightChar + leftChar));
73
}
74
75
if (commands.length > 0) {
76
editor.pushUndoStop();
77
editor.executeCommands(this.id, commands);
78
editor.pushUndoStop();
79
}
80
}
81
}
82
83
registerEditorAction(TransposeLettersAction);
84
85