transpose.js 3.1 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/controller/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 /* WinCtrl */ | 50 /* KeyT */
  23. },
  24. weight: 100 /* EditorContrib */
  25. }
  26. });
  27. }
  28. run(accessor, editor) {
  29. if (!editor.hasModel()) {
  30. return;
  31. }
  32. let model = editor.getModel();
  33. let commands = [];
  34. let selections = editor.getSelections();
  35. for (let selection of selections) {
  36. if (!selection.isEmpty()) {
  37. continue;
  38. }
  39. let lineNumber = selection.startLineNumber;
  40. let column = selection.startColumn;
  41. let 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. let endPosition = (column === lastColumn) ?
  49. selection.getPosition() :
  50. MoveOperations.rightPosition(model, selection.getPosition().lineNumber, selection.getPosition().column);
  51. let middlePosition = MoveOperations.leftPosition(model, endPosition);
  52. let beginPosition = MoveOperations.leftPosition(model, middlePosition);
  53. let leftChar = model.getValueInRange(Range.fromPositions(beginPosition, middlePosition));
  54. let rightChar = model.getValueInRange(Range.fromPositions(middlePosition, endPosition));
  55. let 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);