shortcuts.ts 4.1 KB

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