config.cljs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. (ns frontend.modules.shortcut.config
  2. (:require [frontend.components.commit :as commit]
  3. [frontend.handler.config :as config-handler]
  4. [frontend.handler.editor :as editor-handler]
  5. [frontend.handler.history :as history]
  6. [frontend.handler.repo :as repo-handler]
  7. [frontend.handler.page :as page-handler]
  8. [frontend.handler.route :as route-handler]
  9. [frontend.handler.search :as search-handler]
  10. [frontend.handler.ui :as ui-handler]
  11. [frontend.handler.web.nfs :as nfs-handler]
  12. [frontend.extensions.srs.handler :as srs]
  13. [frontend.modules.shortcut.before :as m]
  14. [frontend.state :as state]
  15. [frontend.util :refer [mac?]]))
  16. ;; TODO: how to extend this for plugins usage? An atom?
  17. (def default-config
  18. {:shortcut.handler/date-picker
  19. {:date-picker/complete
  20. {:desc "Date picker: Choose selected day"
  21. :binding "enter"
  22. :fn ui-handler/shortcut-complete}
  23. :date-picker/prev-day
  24. {:desc "Date picker: Select previous day"
  25. :binding "left"
  26. :fn ui-handler/shortcut-prev-day}
  27. :date-picker/next-day
  28. {:desc "Date picker: Select next day"
  29. :binding "right"
  30. :fn ui-handler/shortcut-next-day}
  31. :date-picker/prev-week
  32. {:desc "Date picker: Select previous week"
  33. :binding "up"
  34. :fn ui-handler/shortcut-prev-week}
  35. :date-picker/next-week
  36. {:desc "Date picker: Select next week"
  37. :binding "down"
  38. :fn ui-handler/shortcut-next-week}}
  39. :shortcut.handler/auto-complete
  40. {:auto-complete/complete
  41. {:desc "Auto-complete: Choose selected item"
  42. :binding "enter"
  43. :fn ui-handler/auto-complete-complete}
  44. :auto-complete/prev
  45. {:desc "Auto-complete: Select previous item"
  46. :binding "up"
  47. :fn ui-handler/auto-complete-prev}
  48. :auto-complete/next
  49. {:desc "Auto-complete: Select next item"
  50. :binding "down"
  51. :fn ui-handler/auto-complete-next}
  52. :auto-complete/shift-complete
  53. {:desc "Auto-complete: Open selected item in sidebar"
  54. :binding "shift+enter"
  55. :fn ui-handler/auto-complete-shift-complete}}
  56. :shortcut.handler/cards
  57. {:cards/toggle-answers
  58. {:desc "Cards: show/hide answers/clozes"
  59. :binding "s"
  60. :fn srs/toggle-answers}
  61. :cards/next-card
  62. {:desc "Cards: next card"
  63. :binding "n"
  64. :fn srs/next-card}
  65. :cards/forgotten
  66. {:desc "Cards: forgotten"
  67. :binding "f"
  68. :fn srs/forgotten}
  69. :cards/remembered
  70. {:desc "Cards: remembered"
  71. :binding "r"
  72. :fn srs/remembered}
  73. :cards/recall
  74. {:desc "Cards: take a while to recall"
  75. :binding "t"
  76. :fn srs/recall}}
  77. :shortcut.handler/block-editing-only
  78. ^{:before m/enable-when-editing-mode!}
  79. {:editor/escape-editing
  80. {:desc "Escape editing (remap to ctrl+open-square-bracket for example)"
  81. :binding false
  82. :fn (fn [_ _] (editor-handler/escape-editing))}
  83. :editor/backspace
  84. {:desc "Backspace / Delete backwards"
  85. :binding "backspace"
  86. :fn editor-handler/editor-backspace}
  87. :editor/delete
  88. {:desc "Delete / Delete forwards"
  89. :binding "delete"
  90. :fn editor-handler/editor-delete}
  91. :editor/new-block
  92. {:desc "Create new block"
  93. :binding "enter"
  94. :fn editor-handler/keydown-new-block-handler}
  95. :editor/new-line
  96. {:desc "New line in current block"
  97. :binding "shift+enter"
  98. :fn editor-handler/keydown-new-line-handler}
  99. :editor/cycle-todo
  100. {:desc "Rotate the TODO state of the current item"
  101. :binding "mod+enter"
  102. :fn editor-handler/cycle-todo!}
  103. :editor/follow-link
  104. {:desc "Follow link under cursor"
  105. :binding "mod+o"
  106. :fn editor-handler/follow-link-under-cursor!}
  107. :editor/open-link-in-sidebar
  108. {:desc "Open link in sidebar"
  109. :binding "mod+shift+o"
  110. :fn editor-handler/open-link-in-sidebar!}
  111. :editor/bold
  112. {:desc "Bold"
  113. :binding "mod+b"
  114. :fn editor-handler/bold-format!}
  115. :editor/italics
  116. {:desc "Italics"
  117. :binding "mod+i"
  118. :fn editor-handler/italics-format!}
  119. :editor/highlight
  120. {:desc "Highlight"
  121. :binding "mod+shift+h"
  122. :fn editor-handler/highlight-format!}
  123. :editor/strike-through
  124. {:desc "Strikethrough"
  125. :binding "mod+shift+s"
  126. :fn editor-handler/strike-through-format!}
  127. :editor/insert-link
  128. {:desc "HTML Link"
  129. :binding "mod+k"
  130. :fn editor-handler/html-link-format!}
  131. :editor/move-block-up
  132. {:desc "Move block up"
  133. :binding (if mac? "mod+shift+up" "alt+shift+up")
  134. :fn (editor-handler/move-up-down true)}
  135. :editor/move-block-down
  136. {:desc "Move block down"
  137. :binding (if mac? "mod+shift+down" "alt+shift+down")
  138. :fn (editor-handler/move-up-down false)}
  139. :editor/clear-block
  140. {:desc "Delete entire block content"
  141. :binding (if mac? "ctrl+l" "alt+l")
  142. :fn editor-handler/clear-block-content!}
  143. :editor/kill-line-before
  144. {:desc "Delete line before cursor position"
  145. :binding (if mac? "ctrl+u" "alt+u")
  146. :fn editor-handler/kill-line-before!}
  147. :editor/kill-line-after
  148. {:desc "Delete line after cursor position"
  149. :binding (if mac? false "alt+k")
  150. :fn editor-handler/kill-line-after!}
  151. :editor/beginning-of-block
  152. {:desc "Move cursor to the beginning of a block"
  153. :binding (if mac? false "alt+a")
  154. :fn editor-handler/beginning-of-block}
  155. :editor/end-of-block
  156. {:desc "Move cursor to the end of a block"
  157. :binding (if mac? false "alt+e")
  158. :fn editor-handler/end-of-block}
  159. :editor/forward-word
  160. {:desc "Move cursor forward a word"
  161. :binding (if mac? "ctrl+shift+f" "alt+f")
  162. :fn editor-handler/cursor-forward-word}
  163. :editor/backward-word
  164. {:desc "Move cursor backward a word"
  165. :binding (if mac? "ctrl+shift+b" "alt+b")
  166. :fn editor-handler/cursor-backward-word}
  167. :editor/forward-kill-word
  168. {:desc "Delete a word forwards"
  169. :binding (if mac? "ctrl+w" "alt+d")
  170. :fn editor-handler/forward-kill-word}
  171. :editor/backward-kill-word
  172. {:desc "Delete a word backwards"
  173. :binding (if mac? false "alt+w")
  174. :fn editor-handler/backward-kill-word}
  175. :editor/replace-block-reference-at-point
  176. {:desc "Replace block reference with its content at point"
  177. :binding "mod+shift+r"
  178. :fn editor-handler/replace-block-reference-with-content-at-point}
  179. :editor/paste-text-in-one-block-at-point
  180. {:desc "Paste text into one block at point"
  181. :binding "mod+shift+v"
  182. :fn editor-handler/paste-text-in-one-block-at-point}}
  183. :shortcut.handler/editor-global
  184. ^{:before m/enable-when-not-component-editing!}
  185. {:editor/up
  186. {:desc "Move cursor up / Select up"
  187. :binding "up"
  188. :fn (editor-handler/shortcut-up-down :up)}
  189. :editor/down
  190. {:desc "Move cursor down / Select down"
  191. :binding "down"
  192. :fn (editor-handler/shortcut-up-down :down)}
  193. :editor/left
  194. {:desc "Move cursor left / Open selected block at beginning"
  195. :binding "left"
  196. :fn (editor-handler/shortcut-left-right :left)}
  197. :editor/right
  198. {:desc "Move cursor right / Open selected block at end"
  199. :binding "right"
  200. :fn (editor-handler/shortcut-left-right :right)}
  201. ;; FIXME
  202. ;; add open edit in non-selection mode
  203. :editor/open-edit
  204. {:desc "Edit selected block"
  205. :binding "enter"
  206. :fn (partial editor-handler/open-selected-block! :right)}
  207. :editor/select-block-up
  208. {:desc "Select block above"
  209. :binding "shift+up"
  210. :fn (editor-handler/on-select-block :up)}
  211. :editor/select-block-down
  212. {:desc "Select block below"
  213. :binding "shift+down"
  214. :fn (editor-handler/on-select-block :down)}
  215. :editor/delete-selection
  216. {:desc "Delete selected blocks"
  217. :binding ["backspace" "delete"]
  218. :fn editor-handler/delete-selection}
  219. :editor/expand-block-children
  220. {:desc "Expand"
  221. :binding "mod+down"
  222. :fn editor-handler/expand!}
  223. :editor/collapse-block-children
  224. {:desc "Collapse"
  225. :binding "mod+up"
  226. :fn editor-handler/collapse!}
  227. :editor/indent
  228. {:desc "Indent block"
  229. :binding "tab"
  230. :fn (editor-handler/keydown-tab-handler :right)}
  231. :editor/outdent
  232. {:desc "Outdent block"
  233. :binding "shift+tab"
  234. :fn (editor-handler/keydown-tab-handler :left)}
  235. :editor/copy
  236. {:desc "Copy"
  237. :binding "mod+c"
  238. :fn editor-handler/shortcut-copy}
  239. :editor/cut
  240. {:desc "Cut"
  241. :binding "mod+x"
  242. :fn editor-handler/shortcut-cut}
  243. :editor/undo
  244. {:desc "Undo"
  245. :binding "mod+z"
  246. :fn history/undo!}
  247. :editor/redo
  248. {:desc "Redo"
  249. :binding ["shift+mod+z" "mod+y"]
  250. :fn history/redo!}
  251. ;; FIXME
  252. ;; save in block editing only doesn't seems needed?
  253. :editor/save
  254. {:binding "mod+s"
  255. :fn editor-handler/save!}}
  256. :shortcut.handler/global-prevent-default
  257. ^{:before m/prevent-default-behavior}
  258. {:editor/select-all-blocks
  259. {:desc "Select all blocks"
  260. :binding "mod+shift+a"
  261. :fn editor-handler/select-all-blocks!}
  262. :editor/zoom-in
  263. {:desc "Zoom in editing block / Forwards otherwise"
  264. :binding (if mac? "mod+." "alt+right")
  265. :fn editor-handler/zoom-in!}
  266. :editor/zoom-out
  267. {:desc "Zoom out editing block / Backwards otherwise"
  268. :binding (if mac? "mod+," "alt+left")
  269. :fn editor-handler/zoom-out!}
  270. :ui/toggle-brackets
  271. {:desc "Toggle whether to display brackets"
  272. :binding "mod+c mod+b"
  273. :fn config-handler/toggle-ui-show-brackets!}
  274. :go/search-in-page
  275. {:desc "Search in the current page"
  276. :binding "mod+shift+u"
  277. :fn #(route-handler/go-to-search! :page)}
  278. :go/search
  279. {:desc "Full text search"
  280. :binding "mod+u"
  281. :fn #(route-handler/go-to-search! :global)}
  282. :go/journals
  283. {:desc "Jump to journals"
  284. :binding (if mac? "mod+j" "alt+j")
  285. :fn route-handler/go-to-journals!}
  286. :go/backward
  287. {:desc "Backwards"
  288. :binding "mod+open-square-bracket"
  289. :fn (fn [_] (js/window.history.back))}
  290. :go/forward
  291. {:desc "Forwards"
  292. :binding "mod+close-square-bracket"
  293. :fn (fn [_] (js/window.history.forward))}
  294. :search/re-index
  295. {:desc "Rebuild search index"
  296. :binding "mod+c mod+s"
  297. :fn search-handler/rebuild-indices!}
  298. :graph/re-index
  299. {:desc "Re-index the whole graph"
  300. :binding "mod+c mod+r"
  301. :fn #(repo-handler/re-index!
  302. nfs-handler/rebuild-index!
  303. page-handler/create-today-journal!)}
  304. :sidebar/open-today-page
  305. {:desc "Open today's page in the right sidebar"
  306. :binding (if mac? "mod+shift+j" "alt+shift+j")
  307. :fn page-handler/open-today-in-sidebar}
  308. :sidebar/clear
  309. {:desc "Clear all in the right sidebar"
  310. :binding "mod+c mod+c"
  311. :fn #(do
  312. (state/clear-sidebar-blocks!)
  313. (state/hide-right-sidebar!))}}
  314. :shortcut.handler/misc
  315. ;; always overrides the copy due to "mod+c mod+s"
  316. {:misc/copy
  317. {:binding "mod+c"
  318. :fn (fn [] (js/document.execCommand "copy"))}}
  319. :shortcut.handler/global-non-editing-only
  320. ^{:before m/enable-when-not-editing-mode!}
  321. {:command/run
  322. {:desc "Run git command"
  323. :binding "mod+shift+1"
  324. :fn #(state/pub-event! [:command/run])}
  325. :go/home
  326. {:desc "Go to home"
  327. :binding "g h"
  328. :fn #(route-handler/redirect! {:to :home})}
  329. :ui/toggle-document-mode
  330. {:desc "Toggle document mode"
  331. :binding "t d"
  332. :fn state/toggle-document-mode!}
  333. :ui/toggle-settings
  334. {:desc "Toggle settings"
  335. :binding (if mac? "t s" ["t s" "mod+,"])
  336. :fn ui-handler/toggle-settings-modal!}
  337. :ui/toggle-right-sidebar
  338. {:desc "Toggle right sidebar"
  339. :binding "t r"
  340. :fn ui-handler/toggle-right-sidebar!}
  341. :ui/toggle-help
  342. {:desc "Toggle help"
  343. :binding "shift+/"
  344. :fn ui-handler/toggle-help!}
  345. :ui/toggle-theme
  346. {:desc "Toggle between dark/light theme"
  347. :binding "t t"
  348. :fn state/toggle-theme!}
  349. :ui/toggle-contents
  350. {:desc "Toggle Favorites in sidebar"
  351. :binding "t f"
  352. :fn ui-handler/toggle-contents!}
  353. :ui/toggle-wide-mode
  354. {:desc "Toggle wide mode"
  355. :binding "t w"
  356. :fn ui-handler/toggle-wide-mode!}
  357. :editor/toggle-open-blocks
  358. {:desc "Toggle open blocks (collapse or expand all blocks)"
  359. :binding "t o"
  360. :fn editor-handler/toggle-open!}
  361. :ui/toggle-cards
  362. {:desc "Toggle cards"
  363. :binding "t c"
  364. :fn ui-handler/toggle-cards!}
  365. ;; :ui/toggle-between-page-and-file route-handler/toggle-between-page-and-file!
  366. :git/commit
  367. {:desc "Git commit message"
  368. :binding "g c"
  369. :fn commit/show-commit-modal!}}})
  370. ;; Categories for docs purpose
  371. (def category
  372. {:shortcut.category/basics
  373. ^{:doc "Basics"}
  374. [:editor/new-block
  375. :editor/new-line
  376. :editor/indent
  377. :editor/outdent
  378. :editor/select-all-blocks
  379. :go/search
  380. :go/search-in-page
  381. :editor/undo
  382. :editor/redo
  383. :editor/copy
  384. :editor/cut]
  385. :shortcut.category/formatting
  386. ^{:doc "Formatting"}
  387. [:editor/bold
  388. :editor/insert-link
  389. :editor/italics
  390. :editor/highlight]
  391. :shortcut.category/navigating
  392. ^{:doc "Navigation"}
  393. [:editor/up
  394. :editor/down
  395. :editor/left
  396. :editor/right
  397. :editor/zoom-in
  398. :editor/zoom-out
  399. :editor/collapse-block-children
  400. :editor/expand-block-children
  401. :editor/toggle-open-blocks
  402. :go/backward
  403. :go/forward]
  404. :shortcut.category/block-editing
  405. ^{:doc "Block editing general"}
  406. [:editor/backspace
  407. :editor/delete
  408. :editor/indent
  409. :editor/outdent
  410. :editor/new-block
  411. :editor/new-line
  412. :editor/zoom-in
  413. :editor/zoom-out
  414. :editor/cycle-todo
  415. :editor/follow-link
  416. :editor/open-link-in-sidebar
  417. :editor/move-block-up
  418. :editor/move-block-down
  419. :editor/escape-editing]
  420. :shortcut.category/block-command-editing
  421. ^{:doc "Block command editing"}
  422. [:editor/backspace
  423. :editor/clear-block
  424. :editor/kill-line-before
  425. :editor/kill-line-after
  426. :editor/beginning-of-block
  427. :editor/end-of-block
  428. :editor/forward-word
  429. :editor/backward-word
  430. :editor/forward-kill-word
  431. :editor/backward-kill-word
  432. :editor/replace-block-reference-at-point
  433. :editor/paste-text-in-one-block-at-point]
  434. :shortcut.category/block-selection
  435. ^{:doc "Block selection (press Esc to quit selection)"}
  436. [:editor/open-edit
  437. :editor/select-all-blocks
  438. :editor/select-block-up
  439. :editor/select-block-down
  440. :editor/delete-selection]
  441. :shortcut.category/toggle
  442. ^{:doc "Toggle"}
  443. [:ui/toggle-help
  444. :editor/toggle-open-blocks
  445. :ui/toggle-wide-mode
  446. :ui/toggle-cards
  447. :ui/toggle-document-mode
  448. :ui/toggle-brackets
  449. :ui/toggle-theme
  450. :ui/toggle-right-sidebar
  451. :ui/toggle-settings
  452. :ui/toggle-contents]
  453. :shortcut.category/others
  454. ^{:doc "Others"}
  455. [:go/home
  456. :go/journals
  457. :sidebar/clear
  458. :sidebar/open-today-page
  459. :search/re-index
  460. :graph/re-index
  461. :auto-complete/prev
  462. :auto-complete/next
  463. :auto-complete/complete
  464. :auto-complete/shift-complete
  465. :date-picker/prev-day
  466. :date-picker/next-day
  467. :date-picker/prev-week
  468. :date-picker/next-week
  469. :date-picker/complete]})