9f8ec28735371baf38b3981ece73dbfa6632161a06bb9be878c493f1ad9f3cd3a47e2c66160fddd4484fb2b9e32317eca19af99e5b314905dc2905d13204f8 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. import { EditorAction, registerEditorAction } from '../../../browser/editorExtensions.js';
  6. import { ReplaceCommand } from '../../../common/commands/replaceCommand.js';
  7. import { MoveOperations } from '../../../common/cursor/cursorMoveOperations.js';
  8. import { Range } from '../../../common/core/range.js';
  9. import { EditorContextKeys } from '../../../common/editorContextKeys.js';
  10. import * as nls from '../../../../nls.js';
  11. class TransposeLettersAction extends EditorAction {
  12. constructor() {
  13. super({
  14. id: 'editor.action.transposeLetters',
  15. label: nls.localize('transposeLetters.label', "Transpose Letters"),
  16. alias: 'Transpose Letters',
  17. precondition: EditorContextKeys.writable,
  18. kbOpts: {
  19. kbExpr: EditorContextKeys.textInputFocus,
  20. primary: 0,
  21. mac: {
  22. primary: 256 /* KeyMod.WinCtrl */ | 50 /* KeyCode.KeyT */
  23. },
  24. weight: 100 /* KeybindingWeight.EditorContrib */
  25. }
  26. });
  27. }
  28. run(accessor, editor) {
  29. if (!editor.hasModel()) {
  30. return;
  31. }
  32. const model = editor.getModel();
  33. const commands = [];
  34. const selections = editor.getSelections();
  35. for (const selection of selections) {
  36. if (!selection.isEmpty()) {
  37. continue;
  38. }
  39. const lineNumber = selection.startLineNumber;
  40. const column = selection.startColumn;
  41. const lastColumn = model.getLineMaxColumn(lineNumber);
  42. if (lineNumber === 1 && (column === 1 || (column === 2 && lastColumn === 2))) {
  43. // at beginning of file, nothing to do
  44. continue;
  45. }
  46. // handle special case: when at end of line, transpose left two chars
  47. // otherwise, transpose left and right chars
  48. const endPosition = (column === lastColumn) ?
  49. selection.getPosition() :
  50. MoveOperations.rightPosition(model, selection.getPosition().lineNumber, selection.getPosition().column);
  51. const middlePosition = MoveOperations.leftPosition(model, endPosition);
  52. const beginPosition = MoveOperations.leftPosition(model, middlePosition);
  53. const leftChar = model.getValueInRange(Range.fromPositions(beginPosition, middlePosition));
  54. const rightChar = model.getValueInRange(Range.fromPositions(middlePosition, endPosition));
  55. const replaceRange = Range.fromPositions(beginPosition, endPosition);
  56. commands.push(new ReplaceCommand(replaceRange, rightChar + leftChar));
  57. }
  58. if (commands.length > 0) {
  59. editor.pushUndoStop();
  60. editor.executeCommands(this.id, commands);
  61. editor.pushUndoStop();
  62. }
  63. }
  64. }
  65. registerEditorAction(TransposeLettersAction);