shortcuts.ts 4.0 KB

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