shortcuts.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { type KeyBinding, keymap } from '@codemirror/view'
  2. import { Prec } from '@codemirror/state'
  3. import { indentMore } from '../commands/indent'
  4. import {
  5. indentLess,
  6. redo,
  7. deleteLine,
  8. toggleLineComment,
  9. cursorLineBoundaryBackward,
  10. selectLineBoundaryBackward,
  11. cursorLineBoundaryForward,
  12. selectLineBoundaryForward,
  13. cursorSyntaxLeft,
  14. selectSyntaxLeft,
  15. cursorSyntaxRight,
  16. selectSyntaxRight,
  17. } from '@codemirror/commands'
  18. import { changeCase, duplicateSelection } from '../commands/ranges'
  19. import { selectOccurrence } from '../commands/select'
  20. import { cloneSelectionVertically } from '../commands/cursor'
  21. import { dispatchEditorEvent } from './changes/change-manager'
  22. export const shortcuts = () => {
  23. const toggleReviewPanel = () => {
  24. dispatchEditorEvent('toggle-review-panel')
  25. return true
  26. }
  27. const addNewCommentFromKbdShortcut = () => {
  28. dispatchEditorEvent('add-new-comment')
  29. return true
  30. }
  31. const toggleTrackChangesFromKbdShortcut = () => {
  32. dispatchEditorEvent('toggle-track-changes')
  33. return true
  34. }
  35. const keyBindings: KeyBinding[] = [
  36. {
  37. key: 'Tab',
  38. preventDefault: true,
  39. run: indentMore,
  40. },
  41. {
  42. key: 'Shift-Tab',
  43. preventDefault: true,
  44. run: indentLess,
  45. },
  46. {
  47. key: 'Ctrl-y',
  48. mac: 'Mod-y',
  49. preventDefault: true,
  50. run: redo,
  51. },
  52. {
  53. key: 'Ctrl-Shift-z',
  54. preventDefault: true,
  55. run: redo,
  56. },
  57. {
  58. key: 'Ctrl-Shift-/',
  59. mac: 'Mod-Shift-/',
  60. preventDefault: true,
  61. run: toggleLineComment,
  62. },
  63. {
  64. key: 'Ctrl-ß',
  65. mac: 'Mod-ß',
  66. preventDefault: true,
  67. run: toggleLineComment,
  68. },
  69. {
  70. key: 'Ctrl-#',
  71. preventDefault: true,
  72. run: toggleLineComment,
  73. },
  74. {
  75. key: 'Ctrl-u',
  76. preventDefault: true,
  77. run: changeCase(true), // uppercase
  78. },
  79. {
  80. key: 'Ctrl-Shift-u',
  81. preventDefault: true,
  82. run: changeCase(false), // lowercase
  83. },
  84. {
  85. key: 'Ctrl-d',
  86. mac: 'Mod-d',
  87. preventDefault: true,
  88. run: deleteLine,
  89. },
  90. {
  91. key: 'Ctrl-j',
  92. mac: 'Mod-j',
  93. preventDefault: true,
  94. run: toggleReviewPanel,
  95. },
  96. {
  97. key: 'Ctrl-Shift-c',
  98. mac: 'Mod-Shift-c',
  99. preventDefault: true,
  100. run: addNewCommentFromKbdShortcut,
  101. },
  102. {
  103. key: 'Ctrl-Shift-a',
  104. mac: 'Mod-Shift-a',
  105. preventDefault: true,
  106. run: toggleTrackChangesFromKbdShortcut,
  107. },
  108. {
  109. key: 'Ctrl-Alt-ArrowUp',
  110. preventDefault: true,
  111. run: cloneSelectionVertically(false, true),
  112. },
  113. {
  114. key: 'Ctrl-Alt-ArrowDown',
  115. preventDefault: true,
  116. run: cloneSelectionVertically(true, true),
  117. },
  118. {
  119. key: 'Ctrl-Alt-Shift-ArrowUp',
  120. preventDefault: true,
  121. run: cloneSelectionVertically(false, false),
  122. },
  123. {
  124. key: 'Ctrl-Alt-Shift-ArrowDown',
  125. preventDefault: true,
  126. run: cloneSelectionVertically(true, false),
  127. },
  128. {
  129. key: 'Ctrl-Alt-ArrowLeft',
  130. preventDefault: true,
  131. run: selectOccurrence(false),
  132. },
  133. {
  134. key: 'Ctrl-Alt-ArrowRight',
  135. preventDefault: true,
  136. run: selectOccurrence(true),
  137. },
  138. {
  139. key: 'Ctrl-Shift-d',
  140. mac: 'Mod-Shift-d',
  141. run: duplicateSelection,
  142. },
  143. {
  144. win: 'Alt-ArrowLeft',
  145. linux: 'Alt-ArrowLeft',
  146. run: cursorLineBoundaryBackward,
  147. shift: selectLineBoundaryBackward,
  148. preventDefault: true,
  149. },
  150. {
  151. win: 'Alt-ArrowRight',
  152. linux: 'Alt-ArrowRight',
  153. run: cursorLineBoundaryForward,
  154. shift: selectLineBoundaryForward,
  155. preventDefault: true,
  156. },
  157. {
  158. mac: 'Ctrl-ArrowLeft',
  159. run: cursorSyntaxLeft,
  160. shift: selectSyntaxLeft,
  161. },
  162. {
  163. mac: 'Ctrl-ArrowRight',
  164. run: cursorSyntaxRight,
  165. shift: selectSyntaxRight,
  166. },
  167. ]
  168. return Prec.high(keymap.of(keyBindings))
  169. }