textarea-keybindings.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { createMemo } from "solid-js"
  2. import type { KeyBinding } from "@opentui/core"
  3. import { useKeybind } from "../context/keybind"
  4. import { Keybind } from "@/util/keybind"
  5. const TEXTAREA_ACTIONS = [
  6. "submit",
  7. "newline",
  8. "move-left",
  9. "move-right",
  10. "move-up",
  11. "move-down",
  12. "select-left",
  13. "select-right",
  14. "select-up",
  15. "select-down",
  16. "line-home",
  17. "line-end",
  18. "select-line-home",
  19. "select-line-end",
  20. "visual-line-home",
  21. "visual-line-end",
  22. "select-visual-line-home",
  23. "select-visual-line-end",
  24. "buffer-home",
  25. "buffer-end",
  26. "select-buffer-home",
  27. "select-buffer-end",
  28. "delete-line",
  29. "delete-to-line-end",
  30. "delete-to-line-start",
  31. "backspace",
  32. "delete",
  33. "undo",
  34. "redo",
  35. "word-forward",
  36. "word-backward",
  37. "select-word-forward",
  38. "select-word-backward",
  39. "delete-word-forward",
  40. "delete-word-backward",
  41. ] as const
  42. function mapTextareaKeybindings(
  43. keybinds: Record<string, Keybind.Info[]>,
  44. action: (typeof TEXTAREA_ACTIONS)[number],
  45. ): KeyBinding[] {
  46. const configKey = `input_${action.replace(/-/g, "_")}`
  47. const bindings = keybinds[configKey]
  48. if (!bindings) return []
  49. return bindings.map((binding) => ({
  50. name: binding.name,
  51. ctrl: binding.ctrl || undefined,
  52. meta: binding.meta || undefined,
  53. shift: binding.shift || undefined,
  54. super: binding.super || undefined,
  55. action,
  56. }))
  57. }
  58. export function useTextareaKeybindings() {
  59. const keybind = useKeybind()
  60. return createMemo(() => {
  61. const keybinds = keybind.all
  62. return [
  63. { name: "return", action: "submit" },
  64. { name: "return", meta: true, action: "newline" },
  65. ...TEXTAREA_ACTIONS.flatMap((action) => mapTextareaKeybindings(keybinds, action)),
  66. ] satisfies KeyBinding[]
  67. })
  68. }