@dst0/p-tui 0.4.41 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/dist/autocomplete.d.ts.map +1 -1
  2. package/dist/autocomplete.js.map +1 -1
  3. package/dist/components/box.d.ts +3 -1
  4. package/dist/components/box.d.ts.map +1 -1
  5. package/dist/components/box.js +19 -10
  6. package/dist/components/box.js.map +1 -1
  7. package/dist/components/cancellable-loader.d.ts.map +1 -1
  8. package/dist/components/cancellable-loader.js.map +1 -1
  9. package/dist/components/editor/constants.d.ts +9 -0
  10. package/dist/components/editor/constants.d.ts.map +1 -0
  11. package/dist/components/editor/constants.js +12 -0
  12. package/dist/components/editor/constants.js.map +1 -0
  13. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts +29 -0
  14. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts.map +1 -0
  15. package/dist/components/editor/editor-methods/autocomplete-matching.js +104 -0
  16. package/dist/components/editor/editor-methods/autocomplete-matching.js.map +1 -0
  17. package/dist/components/editor/editor-methods/autocomplete-request.d.ts +14 -0
  18. package/dist/components/editor/editor-methods/autocomplete-request.d.ts.map +1 -0
  19. package/dist/components/editor/editor-methods/autocomplete-request.js +72 -0
  20. package/dist/components/editor/editor-methods/autocomplete-request.js.map +1 -0
  21. package/dist/components/editor/editor-methods/backspace-cursor.d.ts +9 -0
  22. package/dist/components/editor/editor-methods/backspace-cursor.d.ts.map +1 -0
  23. package/dist/components/editor/editor-methods/backspace-cursor.js +122 -0
  24. package/dist/components/editor/editor-methods/backspace-cursor.js.map +1 -0
  25. package/dist/components/editor/editor-methods/configuration.d.ts +17 -0
  26. package/dist/components/editor/editor-methods/configuration.d.ts.map +1 -0
  27. package/dist/components/editor/editor-methods/configuration.js +107 -0
  28. package/dist/components/editor/editor-methods/configuration.js.map +1 -0
  29. package/dist/components/editor/editor-methods/cursor-movement.d.ts +7 -0
  30. package/dist/components/editor/editor-methods/cursor-movement.d.ts.map +1 -0
  31. package/dist/components/editor/editor-methods/cursor-movement.js +112 -0
  32. package/dist/components/editor/editor-methods/cursor-movement.js.map +1 -0
  33. package/dist/components/editor/editor-methods/input-handling.d.ts +3 -0
  34. package/dist/components/editor/editor-methods/input-handling.d.ts.map +1 -0
  35. package/dist/components/editor/editor-methods/input-handling.js +257 -0
  36. package/dist/components/editor/editor-methods/input-handling.js.map +1 -0
  37. package/dist/components/editor/editor-methods/paste-submit.d.ts +7 -0
  38. package/dist/components/editor/editor-methods/paste-submit.d.ts.map +1 -0
  39. package/dist/components/editor/editor-methods/paste-submit.js +105 -0
  40. package/dist/components/editor/editor-methods/paste-submit.js.map +1 -0
  41. package/dist/components/editor/editor-methods/render.d.ts +3 -0
  42. package/dist/components/editor/editor-methods/render.d.ts.map +1 -0
  43. package/dist/components/editor/editor-methods/render.js +114 -0
  44. package/dist/components/editor/editor-methods/render.js.map +1 -0
  45. package/dist/components/editor/editor-methods/text-insertion.d.ts +4 -0
  46. package/dist/components/editor/editor-methods/text-insertion.d.ts.map +1 -0
  47. package/dist/components/editor/editor-methods/text-insertion.js +91 -0
  48. package/dist/components/editor/editor-methods/text-insertion.js.map +1 -0
  49. package/dist/components/editor/editor-methods/text-layout.d.ts +15 -0
  50. package/dist/components/editor/editor-methods/text-layout.d.ts.map +1 -0
  51. package/dist/components/editor/editor-methods/text-layout.js +129 -0
  52. package/dist/components/editor/editor-methods/text-layout.js.map +1 -0
  53. package/dist/components/editor/editor-methods/vertical-movement.d.ts +8 -0
  54. package/dist/components/editor/editor-methods/vertical-movement.d.ts.map +1 -0
  55. package/dist/components/editor/editor-methods/vertical-movement.js +123 -0
  56. package/dist/components/editor/editor-methods/vertical-movement.js.map +1 -0
  57. package/dist/components/editor/editor-methods/word-operations.d.ts +19 -0
  58. package/dist/components/editor/editor-methods/word-operations.d.ts.map +1 -0
  59. package/dist/components/editor/editor-methods/word-operations.js +122 -0
  60. package/dist/components/editor/editor-methods/word-operations.js.map +1 -0
  61. package/dist/components/editor/editor-methods/yank-undo.d.ts +11 -0
  62. package/dist/components/editor/editor-methods/yank-undo.d.ts.map +1 -0
  63. package/dist/components/editor/editor-methods/yank-undo.js +132 -0
  64. package/dist/components/editor/editor-methods/yank-undo.js.map +1 -0
  65. package/dist/components/editor/editor.d.ts +67 -0
  66. package/dist/components/editor/editor.d.ts.map +1 -0
  67. package/dist/components/editor/editor.js +93 -0
  68. package/dist/components/editor/editor.js.map +1 -0
  69. package/dist/components/editor/helpers.d.ts +3 -0
  70. package/dist/components/editor/helpers.d.ts.map +1 -0
  71. package/dist/components/editor/helpers.js +3 -0
  72. package/dist/components/editor/helpers.js.map +1 -0
  73. package/dist/components/editor/index.d.ts +4 -0
  74. package/dist/components/editor/index.d.ts.map +1 -0
  75. package/dist/components/editor/index.js +3 -0
  76. package/dist/components/editor/index.js.map +1 -0
  77. package/dist/components/editor/paste-marker.d.ts +5 -0
  78. package/dist/components/editor/paste-marker.d.ts.map +1 -0
  79. package/dist/components/editor/paste-marker.js +134 -0
  80. package/dist/components/editor/paste-marker.js.map +1 -0
  81. package/dist/components/editor/trigger-patterns.d.ts +4 -0
  82. package/dist/components/editor/trigger-patterns.d.ts.map +1 -0
  83. package/dist/components/editor/trigger-patterns.js +11 -0
  84. package/dist/components/editor/trigger-patterns.js.map +1 -0
  85. package/dist/components/editor/types.d.ts +25 -0
  86. package/dist/components/editor/types.d.ts.map +1 -0
  87. package/dist/components/editor/types.js +2 -0
  88. package/dist/components/editor/types.js.map +1 -0
  89. package/dist/components/editor.d.ts +1 -253
  90. package/dist/components/editor.d.ts.map +1 -1
  91. package/dist/components/editor.js +1 -1915
  92. package/dist/components/editor.js.map +1 -1
  93. package/dist/components/image.d.ts.map +1 -1
  94. package/dist/components/image.js.map +1 -1
  95. package/dist/components/input/constants.d.ts +2 -0
  96. package/dist/components/input/constants.d.ts.map +1 -0
  97. package/dist/components/input/constants.js +3 -0
  98. package/dist/components/input/constants.js.map +1 -0
  99. package/dist/components/input/index.d.ts +2 -0
  100. package/dist/components/input/index.d.ts.map +1 -0
  101. package/dist/components/input/index.js +2 -0
  102. package/dist/components/input/index.js.map +1 -0
  103. package/dist/components/input/input-methods/input-handling.d.ts +3 -0
  104. package/dist/components/input/input-methods/input-handling.d.ts.map +1 -0
  105. package/dist/components/input/input-methods/input-handling.js +145 -0
  106. package/dist/components/input/input-methods/input-handling.js.map +1 -0
  107. package/dist/components/input/input-methods/render.d.ts +3 -0
  108. package/dist/components/input/input-methods/render.d.ts.map +1 -0
  109. package/dist/components/input/input-methods/render.js +62 -0
  110. package/dist/components/input/input-methods/render.js.map +1 -0
  111. package/dist/components/input/input-methods/text-editing.d.ts +17 -0
  112. package/dist/components/input/input-methods/text-editing.d.ts.map +1 -0
  113. package/dist/components/input/input-methods/text-editing.js +145 -0
  114. package/dist/components/input/input-methods/text-editing.js.map +1 -0
  115. package/dist/components/input/input-methods/value-access.d.ts +4 -0
  116. package/dist/components/input/input-methods/value-access.d.ts.map +1 -0
  117. package/dist/components/input/input-methods/value-access.js +20 -0
  118. package/dist/components/input/input-methods/value-access.js.map +1 -0
  119. package/dist/components/input/input.d.ts +37 -0
  120. package/dist/components/input/input.d.ts.map +1 -0
  121. package/dist/components/input/input.js +77 -0
  122. package/dist/components/input/input.js.map +1 -0
  123. package/dist/components/input/types.d.ts +5 -0
  124. package/dist/components/input/types.d.ts.map +1 -0
  125. package/dist/components/input/types.js +2 -0
  126. package/dist/components/input/types.js.map +1 -0
  127. package/dist/components/input.d.ts +1 -36
  128. package/dist/components/input.d.ts.map +1 -1
  129. package/dist/components/input.js +1 -377
  130. package/dist/components/input.js.map +1 -1
  131. package/dist/components/loader.d.ts.map +1 -1
  132. package/dist/components/loader.js.map +1 -1
  133. package/dist/components/markdown/constants.d.ts +4 -0
  134. package/dist/components/markdown/constants.d.ts.map +1 -0
  135. package/dist/components/markdown/constants.js +8 -0
  136. package/dist/components/markdown/constants.js.map +1 -0
  137. package/dist/components/markdown/index.d.ts +3 -0
  138. package/dist/components/markdown/index.d.ts.map +1 -0
  139. package/dist/components/markdown/index.js +2 -0
  140. package/dist/components/markdown/index.js.map +1 -0
  141. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts +7 -0
  142. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts.map +1 -0
  143. package/dist/components/markdown/markdown-methods/inline-rendering.js +95 -0
  144. package/dist/components/markdown/markdown-methods/inline-rendering.js.map +1 -0
  145. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts +7 -0
  146. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts.map +1 -0
  147. package/dist/components/markdown/markdown-methods/list-table-helpers.js +61 -0
  148. package/dist/components/markdown/markdown-methods/list-table-helpers.js.map +1 -0
  149. package/dist/components/markdown/markdown-methods/table-rendering.d.ts +5 -0
  150. package/dist/components/markdown/markdown-methods/table-rendering.d.ts.map +1 -0
  151. package/dist/components/markdown/markdown-methods/table-rendering.js +146 -0
  152. package/dist/components/markdown/markdown-methods/table-rendering.js.map +1 -0
  153. package/dist/components/markdown/markdown-methods/text-rendering.d.ts +6 -0
  154. package/dist/components/markdown/markdown-methods/text-rendering.d.ts.map +1 -0
  155. package/dist/components/markdown/markdown-methods/text-rendering.js +115 -0
  156. package/dist/components/markdown/markdown-methods/text-rendering.js.map +1 -0
  157. package/dist/components/markdown/markdown-methods/theming.d.ts +6 -0
  158. package/dist/components/markdown/markdown-methods/theming.d.ts.map +1 -0
  159. package/dist/components/markdown/markdown-methods/theming.js +41 -0
  160. package/dist/components/markdown/markdown-methods/theming.js.map +1 -0
  161. package/dist/components/markdown/markdown-methods/token-rendering.d.ts +5 -0
  162. package/dist/components/markdown/markdown-methods/token-rendering.d.ts.map +1 -0
  163. package/dist/components/markdown/markdown-methods/token-rendering.js +142 -0
  164. package/dist/components/markdown/markdown-methods/token-rendering.js.map +1 -0
  165. package/dist/components/markdown/markdown.d.ts +32 -0
  166. package/dist/components/markdown/markdown.d.ts.map +1 -0
  167. package/dist/components/markdown/markdown.js +72 -0
  168. package/dist/components/markdown/markdown.js.map +1 -0
  169. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts +6 -0
  170. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts.map +1 -0
  171. package/dist/components/markdown/strictstrikethroughtokenizer.js +18 -0
  172. package/dist/components/markdown/strictstrikethroughtokenizer.js.map +1 -0
  173. package/dist/components/markdown/types.d.ts +42 -0
  174. package/dist/components/markdown/types.d.ts.map +1 -0
  175. package/dist/components/markdown/types.js +2 -0
  176. package/dist/components/markdown/types.js.map +1 -0
  177. package/dist/components/markdown.d.ts +1 -96
  178. package/dist/components/markdown.d.ts.map +1 -1
  179. package/dist/components/markdown.js +1 -653
  180. package/dist/components/markdown.js.map +1 -1
  181. package/dist/components/select-list.d.ts.map +1 -1
  182. package/dist/components/select-list.js +8 -3
  183. package/dist/components/select-list.js.map +1 -1
  184. package/dist/components/settings-list.d.ts.map +1 -1
  185. package/dist/components/settings-list.js +2 -6
  186. package/dist/components/settings-list.js.map +1 -1
  187. package/dist/components/spacer.d.ts.map +1 -1
  188. package/dist/components/spacer.js.map +1 -1
  189. package/dist/components/text.d.ts.map +1 -1
  190. package/dist/components/text.js +2 -2
  191. package/dist/components/text.js.map +1 -1
  192. package/dist/components/truncated-text.d.ts.map +1 -1
  193. package/dist/components/truncated-text.js.map +1 -1
  194. package/dist/editor-component.d.ts.map +1 -1
  195. package/dist/editor-component.js.map +1 -1
  196. package/dist/fuzzy.d.ts.map +1 -1
  197. package/dist/fuzzy.js.map +1 -1
  198. package/dist/index.d.ts +1 -1
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +1 -1
  201. package/dist/index.js.map +1 -1
  202. package/dist/keybindings.d.ts.map +1 -1
  203. package/dist/keybindings.js.map +1 -1
  204. package/dist/keys.d.ts.map +1 -1
  205. package/dist/keys.js +145 -14
  206. package/dist/keys.js.map +1 -1
  207. package/dist/kill-ring.d.ts.map +1 -1
  208. package/dist/kill-ring.js.map +1 -1
  209. package/dist/native-modifiers.d.ts +9 -0
  210. package/dist/native-modifiers.d.ts.map +1 -1
  211. package/dist/native-modifiers.js +5 -0
  212. package/dist/native-modifiers.js.map +1 -1
  213. package/dist/stdin-buffer.d.ts +3 -0
  214. package/dist/stdin-buffer.d.ts.map +1 -1
  215. package/dist/stdin-buffer.js +24 -21
  216. package/dist/stdin-buffer.js.map +1 -1
  217. package/dist/terminal/constants.d.ts +9 -0
  218. package/dist/terminal/constants.d.ts.map +1 -0
  219. package/dist/terminal/constants.js +10 -0
  220. package/dist/terminal/constants.js.map +1 -0
  221. package/dist/terminal/helpers.d.ts +6 -0
  222. package/dist/terminal/helpers.d.ts.map +1 -0
  223. package/dist/terminal/helpers.js +23 -0
  224. package/dist/terminal/helpers.js.map +1 -0
  225. package/dist/terminal/index.d.ts +4 -0
  226. package/dist/terminal/index.d.ts.map +1 -0
  227. package/dist/terminal/index.js +3 -0
  228. package/dist/terminal/index.js.map +1 -0
  229. package/dist/terminal/processterminal-methods/cursor-screen.d.ts +11 -0
  230. package/dist/terminal/processterminal-methods/cursor-screen.d.ts.map +1 -0
  231. package/dist/terminal/processterminal-methods/cursor-screen.js +50 -0
  232. package/dist/terminal/processterminal-methods/cursor-screen.js.map +1 -0
  233. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts +14 -0
  234. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts.map +1 -0
  235. package/dist/terminal/processterminal-methods/keyboard-protocol.js +147 -0
  236. package/dist/terminal/processterminal-methods/keyboard-protocol.js.map +1 -0
  237. package/dist/terminal/processterminal-methods/terminal-io.d.ts +9 -0
  238. package/dist/terminal/processterminal-methods/terminal-io.d.ts.map +1 -0
  239. package/dist/terminal/processterminal-methods/terminal-io.js +153 -0
  240. package/dist/terminal/processterminal-methods/terminal-io.js.map +1 -0
  241. package/dist/terminal/processterminal.d.ts +49 -0
  242. package/dist/terminal/processterminal.d.ts.map +1 -0
  243. package/dist/terminal/processterminal.js +129 -0
  244. package/dist/terminal/processterminal.js.map +1 -0
  245. package/dist/terminal/types.d.ts +31 -0
  246. package/dist/terminal/types.d.ts.map +1 -0
  247. package/dist/terminal/types.js +2 -0
  248. package/dist/terminal/types.js.map +1 -0
  249. package/dist/terminal-colors.d.ts +2 -0
  250. package/dist/terminal-colors.d.ts.map +1 -1
  251. package/dist/terminal-colors.js +17 -5
  252. package/dist/terminal-colors.js.map +1 -1
  253. package/dist/terminal-image.d.ts.map +1 -1
  254. package/dist/terminal-image.js.map +1 -1
  255. package/dist/terminal.d.ts +1 -109
  256. package/dist/terminal.d.ts.map +1 -1
  257. package/dist/terminal.js +1 -432
  258. package/dist/terminal.js.map +1 -1
  259. package/dist/tui/constants.d.ts +3 -0
  260. package/dist/tui/constants.d.ts.map +1 -0
  261. package/dist/tui/constants.js +3 -0
  262. package/dist/tui/constants.js.map +1 -0
  263. package/dist/tui/container.d.ts +10 -0
  264. package/dist/tui/container.d.ts.map +1 -0
  265. package/dist/tui/container.js +31 -0
  266. package/dist/tui/container.js.map +1 -0
  267. package/dist/tui/helpers.d.ts +8 -0
  268. package/dist/tui/helpers.d.ts.map +1 -0
  269. package/dist/tui/helpers.js +53 -0
  270. package/dist/tui/helpers.js.map +1 -0
  271. package/dist/tui/index.d.ts +6 -0
  272. package/dist/tui/index.d.ts.map +1 -0
  273. package/dist/tui/index.js +5 -0
  274. package/dist/tui/index.js.map +1 -0
  275. package/dist/tui/tui-methods/configuration.d.ts +20 -0
  276. package/dist/tui/tui-methods/configuration.d.ts.map +1 -0
  277. package/dist/tui/tui-methods/configuration.js +131 -0
  278. package/dist/tui/tui-methods/configuration.js.map +1 -0
  279. package/dist/tui/tui-methods/cursor-background.d.ts +10 -0
  280. package/dist/tui/tui-methods/cursor-background.d.ts.map +1 -0
  281. package/dist/tui/tui-methods/cursor-background.js +52 -0
  282. package/dist/tui/tui-methods/cursor-background.js.map +1 -0
  283. package/dist/tui/tui-methods/incremental-render.d.ts +17 -0
  284. package/dist/tui/tui-methods/incremental-render.d.ts.map +1 -0
  285. package/dist/tui/tui-methods/incremental-render.js +259 -0
  286. package/dist/tui/tui-methods/incremental-render.js.map +1 -0
  287. package/dist/tui/tui-methods/input-handling.d.ts +5 -0
  288. package/dist/tui/tui-methods/input-handling.d.ts.map +1 -0
  289. package/dist/tui/tui-methods/input-handling.js +111 -0
  290. package/dist/tui/tui-methods/input-handling.js.map +1 -0
  291. package/dist/tui/tui-methods/line-compositing.d.ts +7 -0
  292. package/dist/tui/tui-methods/line-compositing.d.ts.map +1 -0
  293. package/dist/tui/tui-methods/line-compositing.js +61 -0
  294. package/dist/tui/tui-methods/line-compositing.js.map +1 -0
  295. package/dist/tui/tui-methods/overlay-compositing.d.ts +12 -0
  296. package/dist/tui/tui-methods/overlay-compositing.d.ts.map +1 -0
  297. package/dist/tui/tui-methods/overlay-compositing.js +123 -0
  298. package/dist/tui/tui-methods/overlay-compositing.js.map +1 -0
  299. package/dist/tui/tui-methods/overlay-layout.d.ts +11 -0
  300. package/dist/tui/tui-methods/overlay-layout.d.ts.map +1 -0
  301. package/dist/tui/tui-methods/overlay-layout.js +124 -0
  302. package/dist/tui/tui-methods/overlay-layout.js.map +1 -0
  303. package/dist/tui/tui-methods/overlay-management.d.ts +11 -0
  304. package/dist/tui/tui-methods/overlay-management.d.ts.map +1 -0
  305. package/dist/tui/tui-methods/overlay-management.js +152 -0
  306. package/dist/tui/tui-methods/overlay-management.js.map +1 -0
  307. package/dist/tui/tui-methods/render-pipeline.d.ts +3 -0
  308. package/dist/tui/tui-methods/render-pipeline.d.ts.map +1 -0
  309. package/dist/tui/tui-methods/render-pipeline.js +176 -0
  310. package/dist/tui/tui-methods/render-pipeline.js.map +1 -0
  311. package/dist/tui/tui-methods/render-width-error.d.ts +3 -0
  312. package/dist/tui/tui-methods/render-width-error.d.ts.map +1 -0
  313. package/dist/tui/tui-methods/render-width-error.js +28 -0
  314. package/dist/tui/tui-methods/render-width-error.js.map +1 -0
  315. package/dist/tui/tui-methods/terminal-control.d.ts +8 -0
  316. package/dist/tui/tui-methods/terminal-control.d.ts.map +1 -0
  317. package/dist/tui/tui-methods/terminal-control.js +101 -0
  318. package/dist/tui/tui-methods/terminal-control.js.map +1 -0
  319. package/dist/tui/tui.d.ts +59 -0
  320. package/dist/tui/tui.d.ts.map +1 -0
  321. package/dist/tui/tui.js +78 -0
  322. package/dist/tui/tui.js.map +1 -0
  323. package/dist/tui/types.d.ts +124 -0
  324. package/dist/tui/types.d.ts.map +1 -0
  325. package/dist/tui/types.js +2 -0
  326. package/dist/tui/types.js.map +1 -0
  327. package/dist/tui.d.ts +1 -254
  328. package/dist/tui.d.ts.map +1 -1
  329. package/dist/tui.js +1 -1344
  330. package/dist/tui.js.map +1 -1
  331. package/dist/undo-stack.d.ts.map +1 -1
  332. package/dist/undo-stack.js.map +1 -1
  333. package/dist/utils/ansi-wrapping.d.ts +5 -0
  334. package/dist/utils/ansi-wrapping.d.ts.map +1 -0
  335. package/dist/utils/ansi-wrapping.js +52 -0
  336. package/dist/utils/ansi-wrapping.js.map +1 -0
  337. package/dist/utils/ansicodetracker.d.ts +27 -0
  338. package/dist/utils/ansicodetracker.d.ts.map +1 -0
  339. package/dist/utils/ansicodetracker.js +222 -0
  340. package/dist/utils/ansicodetracker.js.map +1 -0
  341. package/dist/utils/column-slicing.d.ts +12 -0
  342. package/dist/utils/column-slicing.d.ts.map +1 -0
  343. package/dist/utils/column-slicing.js +111 -0
  344. package/dist/utils/column-slicing.js.map +1 -0
  345. package/dist/utils/column-truncation.d.ts +2 -0
  346. package/dist/utils/column-truncation.d.ts.map +1 -0
  347. package/dist/utils/column-truncation.js +129 -0
  348. package/dist/utils/column-truncation.js.map +1 -0
  349. package/dist/utils/constants.d.ts +12 -0
  350. package/dist/utils/constants.d.ts.map +1 -0
  351. package/dist/utils/constants.js +12 -0
  352. package/dist/utils/constants.js.map +1 -0
  353. package/dist/utils/index.d.ts +8 -0
  354. package/dist/utils/index.d.ts.map +1 -0
  355. package/dist/utils/index.js +8 -0
  356. package/dist/utils/index.js.map +1 -0
  357. package/dist/utils/install-delegated-methods.d.ts +5 -0
  358. package/dist/utils/install-delegated-methods.d.ts.map +1 -0
  359. package/dist/utils/install-delegated-methods.js +27 -0
  360. package/dist/utils/install-delegated-methods.js.map +1 -0
  361. package/dist/utils/segmentation.d.ts +10 -0
  362. package/dist/utils/segmentation.d.ts.map +1 -0
  363. package/dist/utils/segmentation.js +111 -0
  364. package/dist/utils/segmentation.js.map +1 -0
  365. package/dist/utils/terminal-output.d.ts +10 -0
  366. package/dist/utils/terminal-output.d.ts.map +1 -0
  367. package/dist/utils/terminal-output.js +122 -0
  368. package/dist/utils/terminal-output.js.map +1 -0
  369. package/dist/utils/types.d.ts +7 -0
  370. package/dist/utils/types.d.ts.map +1 -0
  371. package/dist/utils/types.js +2 -0
  372. package/dist/utils/types.js.map +1 -0
  373. package/dist/utils/width-truncation.d.ts +6 -0
  374. package/dist/utils/width-truncation.d.ts.map +1 -0
  375. package/dist/utils/width-truncation.js +121 -0
  376. package/dist/utils/width-truncation.js.map +1 -0
  377. package/dist/utils/word-wrapping.d.ts +4 -0
  378. package/dist/utils/word-wrapping.d.ts.map +1 -0
  379. package/dist/utils/word-wrapping.js +139 -0
  380. package/dist/utils/word-wrapping.js.map +1 -0
  381. package/dist/utils.d.ts +1 -84
  382. package/dist/utils.d.ts.map +1 -1
  383. package/dist/utils.js +1 -1059
  384. package/dist/utils.js.map +1 -1
  385. package/dist/word-navigation.d.ts.map +1 -1
  386. package/dist/word-navigation.js.map +1 -1
  387. package/package.json +2 -1
@@ -0,0 +1,107 @@
1
+ import { graphemeSegmenter, wordSegmenter } from "../constants.js";
2
+ import { segmentWithMarkers } from "../paste-marker.js";
3
+ export function do_validPasteIds(self) {
4
+ return new Set(self.pastes.keys());
5
+ }
6
+ export function do_segment(self, text, mode) {
7
+ return segmentWithMarkers(text, mode === "word" ? wordSegmenter : graphemeSegmenter, self.validPasteIds());
8
+ }
9
+ export function do_getPaddingX(self) {
10
+ return self.paddingX;
11
+ }
12
+ export function do_setPaddingX(self, padding) {
13
+ const newPadding = Number.isFinite(padding) ? Math.max(0, Math.floor(padding)) : 0;
14
+ if (self.paddingX !== newPadding) {
15
+ self.paddingX = newPadding;
16
+ self.tui.requestRender();
17
+ }
18
+ }
19
+ export function do_getAutocompleteMaxVisible(self) {
20
+ return self.autocompleteMaxVisible;
21
+ }
22
+ export function do_setAutocompleteMaxVisible(self, maxVisible) {
23
+ const newMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;
24
+ if (self.autocompleteMaxVisible !== newMaxVisible) {
25
+ self.autocompleteMaxVisible = newMaxVisible;
26
+ self.tui.requestRender();
27
+ }
28
+ }
29
+ export function do_setAutocompleteProvider(self, provider) {
30
+ self.cancelAutocomplete();
31
+ self.autocompleteProvider = provider;
32
+ self.setAutocompleteTriggerCharacters(provider.triggerCharacters ?? []);
33
+ }
34
+ export function do_addToHistory(self, text) {
35
+ const trimmed = text.trim();
36
+ if (!trimmed)
37
+ return;
38
+ // Don't add consecutive duplicates
39
+ if (self.history.length > 0 && self.history[0] === trimmed)
40
+ return;
41
+ self.history.unshift(trimmed);
42
+ // Limit history size
43
+ if (self.history.length > 100) {
44
+ self.history.pop();
45
+ }
46
+ }
47
+ export function do_isOnFirstVisualLine(self) {
48
+ const visualLines = self.buildVisualLineMap(self.lastWidth);
49
+ const currentVisualLine = self.findCurrentVisualLine(visualLines);
50
+ return currentVisualLine === 0;
51
+ }
52
+ export function do_isOnLastVisualLine(self) {
53
+ const visualLines = self.buildVisualLineMap(self.lastWidth);
54
+ const currentVisualLine = self.findCurrentVisualLine(visualLines);
55
+ return currentVisualLine === visualLines.length - 1;
56
+ }
57
+ export function do_navigateHistory(self, direction) {
58
+ self.lastAction = null;
59
+ if (self.history.length === 0)
60
+ return;
61
+ const newIndex = self.historyIndex - direction; // Up(-1) increases index, Down(1) decreases
62
+ if (newIndex < -1 || newIndex >= self.history.length)
63
+ return;
64
+ // Capture state when first entering history browsing mode
65
+ if (self.historyIndex === -1 && newIndex >= 0) {
66
+ self.pushUndoSnapshot();
67
+ self.historyDraft = structuredClone(self.state);
68
+ }
69
+ self.historyIndex = newIndex;
70
+ if (self.historyIndex === -1) {
71
+ const draft = self.historyDraft;
72
+ self.historyDraft = null;
73
+ if (draft) {
74
+ self.state = draft;
75
+ self.preferredVisualCol = null;
76
+ self.snappedFromCursorCol = null;
77
+ self.scrollOffset = 0;
78
+ if (self.onChange)
79
+ self.onChange(self.getText());
80
+ }
81
+ else {
82
+ self.setTextInternal("");
83
+ }
84
+ }
85
+ else {
86
+ self.setTextInternal(self.history[self.historyIndex] || "", direction === -1 ? "start" : "end");
87
+ }
88
+ }
89
+ export function do_exitHistoryBrowsing(self) {
90
+ self.historyIndex = -1;
91
+ self.historyDraft = null;
92
+ }
93
+ export function do_setTextInternal(self, text, cursorPlacement = "end") {
94
+ const lines = text.split("\n");
95
+ self.state.lines = lines.length === 0 ? [""] : lines;
96
+ self.state.cursorLine = cursorPlacement === "start" ? 0 : self.state.lines.length - 1;
97
+ self.setCursorCol(cursorPlacement === "start" ? 0 : self.state.lines[self.state.cursorLine]?.length || 0);
98
+ // Reset scroll - render() will adjust to show cursor
99
+ self.scrollOffset = 0;
100
+ if (self.onChange) {
101
+ self.onChange(self.getText());
102
+ }
103
+ }
104
+ export function do_invalidate(_self) {
105
+ // No cached state to invalidate currently
106
+ }
107
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/configuration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAe;IAC1D,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,CACpC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,IAAyB,EAA8B;IAC5G,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAAA,CAC5G;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAU;IACnD,OAAO,IAAI,CAAC,QAAQ,CAAC;AAAA,CACtB;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe,EAAQ;IAClE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;AAAA,CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY,EAAU;IACjE,OAAO,IAAI,CAAC,sBAAsB,CAAC;AAAA,CACpC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY,EAAE,UAAkB,EAAQ;IACnF,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1G,IAAI,IAAI,CAAC,sBAAsB,KAAK,aAAa,EAAE,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,aAAa,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,QAA8B,EAAQ;IAC7F,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC1B,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;AAAA,CACzE;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY,EAAQ;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,mCAAmC;IACnC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO;IACnE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB;IACrB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AAAA,CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAW;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAClE,OAAO,iBAAiB,KAAK,CAAC,CAAC;AAAA,CAChC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAW;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAClE,OAAO,iBAAiB,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAAA,CACrD;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB,EAAQ;IACxE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,4CAA4C;IAC5F,IAAI,QAAQ,GAAG,CAAC,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO;IAE7D,0DAA0D;IAC1D,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;IAE7B,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClG,CAAC;AAAA,CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAQ;IACzD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAAA,CAC1B;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY,EAAE,eAAe,GAAoB,KAAK,EAAQ;IAC7G,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACtF,IAAI,CAAC,YAAY,CAAC,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAC1G,qDAAqD;IACrD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAEtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;AAAA,CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAQ;IACjD,0CAA0C;AADQ,CAEnD","sourcesContent":["import type { AutocompleteProvider } from \"../../../autocomplete.ts\";\nimport { graphemeSegmenter, wordSegmenter } from \"../constants.ts\";\nimport type { Editor } from \"../editor.ts\";\nimport { segmentWithMarkers } from \"../paste-marker.ts\";\n\nexport function do_validPasteIds(self: Editor): Set<number> {\n return new Set(self.pastes.keys());\n}\n\nexport function do_segment(self: Editor, text: string, mode: \"word\" | \"grapheme\"): Iterable<Intl.SegmentData> {\n return segmentWithMarkers(text, mode === \"word\" ? wordSegmenter : graphemeSegmenter, self.validPasteIds());\n}\n\nexport function do_getPaddingX(self: Editor): number {\n return self.paddingX;\n}\n\nexport function do_setPaddingX(self: Editor, padding: number): void {\n const newPadding = Number.isFinite(padding) ? Math.max(0, Math.floor(padding)) : 0;\n if (self.paddingX !== newPadding) {\n self.paddingX = newPadding;\n self.tui.requestRender();\n }\n}\n\nexport function do_getAutocompleteMaxVisible(self: Editor): number {\n return self.autocompleteMaxVisible;\n}\n\nexport function do_setAutocompleteMaxVisible(self: Editor, maxVisible: number): void {\n const newMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n if (self.autocompleteMaxVisible !== newMaxVisible) {\n self.autocompleteMaxVisible = newMaxVisible;\n self.tui.requestRender();\n }\n}\n\nexport function do_setAutocompleteProvider(self: Editor, provider: AutocompleteProvider): void {\n self.cancelAutocomplete();\n self.autocompleteProvider = provider;\n self.setAutocompleteTriggerCharacters(provider.triggerCharacters ?? []);\n}\n\nexport function do_addToHistory(self: Editor, text: string): void {\n const trimmed = text.trim();\n if (!trimmed) return;\n // Don't add consecutive duplicates\n if (self.history.length > 0 && self.history[0] === trimmed) return;\n self.history.unshift(trimmed);\n // Limit history size\n if (self.history.length > 100) {\n self.history.pop();\n }\n}\n\nexport function do_isOnFirstVisualLine(self: Editor): boolean {\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n return currentVisualLine === 0;\n}\n\nexport function do_isOnLastVisualLine(self: Editor): boolean {\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n return currentVisualLine === visualLines.length - 1;\n}\n\nexport function do_navigateHistory(self: Editor, direction: 1 | -1): void {\n self.lastAction = null;\n if (self.history.length === 0) return;\n\n const newIndex = self.historyIndex - direction; // Up(-1) increases index, Down(1) decreases\n if (newIndex < -1 || newIndex >= self.history.length) return;\n\n // Capture state when first entering history browsing mode\n if (self.historyIndex === -1 && newIndex >= 0) {\n self.pushUndoSnapshot();\n self.historyDraft = structuredClone(self.state);\n }\n\n self.historyIndex = newIndex;\n\n if (self.historyIndex === -1) {\n const draft = self.historyDraft;\n self.historyDraft = null;\n if (draft) {\n self.state = draft;\n self.preferredVisualCol = null;\n self.snappedFromCursorCol = null;\n self.scrollOffset = 0;\n if (self.onChange) self.onChange(self.getText());\n } else {\n self.setTextInternal(\"\");\n }\n } else {\n self.setTextInternal(self.history[self.historyIndex] || \"\", direction === -1 ? \"start\" : \"end\");\n }\n}\n\nexport function do_exitHistoryBrowsing(self: Editor): void {\n self.historyIndex = -1;\n self.historyDraft = null;\n}\n\nexport function do_setTextInternal(self: Editor, text: string, cursorPlacement: \"start\" | \"end\" = \"end\"): void {\n const lines = text.split(\"\\n\");\n self.state.lines = lines.length === 0 ? [\"\"] : lines;\n self.state.cursorLine = cursorPlacement === \"start\" ? 0 : self.state.lines.length - 1;\n self.setCursorCol(cursorPlacement === \"start\" ? 0 : self.state.lines[self.state.cursorLine]?.length || 0);\n // Reset scroll - render() will adjust to show cursor\n self.scrollOffset = 0;\n\n if (self.onChange) {\n self.onChange(self.getText());\n }\n}\n\nexport function do_invalidate(_self: Editor): void {\n // No cached state to invalidate currently\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Editor } from "../editor.ts";
2
+ export declare function do_moveCursor(self: Editor, deltaLine: number, deltaCol: number): void;
3
+ export declare function do_pageScroll(self: Editor, direction: -1 | 1): void;
4
+ export declare function do_moveWordBackwards(self: Editor): void;
5
+ export declare function do_yank(self: Editor): void;
6
+ export declare function do_yankPop(self: Editor): void;
7
+ //# sourceMappingURL=cursor-movement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-movement.d.ts","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/cursor-movement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA6DrF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAUnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoBvD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAS1C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiB7C","sourcesContent":["import { findWordBackward } from \"../../../word-navigation.ts\";\nimport type { Editor } from \"../editor.ts\";\nimport { isPasteMarker } from \"../paste-marker.ts\";\n\nexport function do_moveCursor(self: Editor, deltaLine: number, deltaCol: number): void {\n self.lastAction = null;\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n\n if (deltaLine !== 0) {\n const targetVisualLine = currentVisualLine + deltaLine;\n\n if (targetVisualLine >= 0 && targetVisualLine < visualLines.length) {\n self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n }\n }\n\n if (deltaCol !== 0) {\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n\n if (deltaCol > 0) {\n // Moving right - move by one grapheme (handles emojis, combining characters, etc.)\n if (self.state.cursorCol < currentLine.length) {\n const afterCursor = currentLine.slice(self.state.cursorCol);\n const graphemes = [...self.segment(afterCursor, \"grapheme\")];\n const firstGrapheme = graphemes[0];\n self.setCursorCol(self.state.cursorCol + (firstGrapheme ? firstGrapheme.segment.length : 1));\n } else if (self.state.cursorLine < self.state.lines.length - 1) {\n // Wrap to start of next logical line\n self.state.cursorLine++;\n self.setCursorCol(0);\n } else {\n // At end of last line - can't move, but set preferredVisualCol for up/down navigation\n const currentVL = visualLines[currentVisualLine];\n if (currentVL) {\n self.preferredVisualCol = self.state.cursorCol - currentVL.startCol;\n }\n }\n } else {\n // Moving left - move by one grapheme (handles emojis, combining characters, etc.)\n if (self.state.cursorCol > 0) {\n const beforeCursor = currentLine.slice(0, self.state.cursorCol);\n const graphemes = [...self.segment(beforeCursor, \"grapheme\")];\n const lastGrapheme = graphemes[graphemes.length - 1];\n self.setCursorCol(self.state.cursorCol - (lastGrapheme ? lastGrapheme.segment.length : 1));\n } else if (self.state.cursorLine > 0) {\n // Wrap to end of previous logical line\n self.state.cursorLine--;\n const prevLine = self.state.lines[self.state.cursorLine] || \"\";\n self.setCursorCol(prevLine.length);\n }\n }\n }\n\n // Keep an open autocomplete picker in sync with the new cursor\n // position: cursor movement changes the text before the cursor, so a\n // picker computed for the old position is stale. Re-query so it\n // refreshes — or closes when the new position yields no suggestions —\n // mirroring insertCharacter()/handleBackspace(). Without self, arrowing\n // left from `/cmd ` back into the command name leaves the argument\n // picker showing against a `/cmd` prefix (and a Tab there would\n // concatenate the stale suggestion onto the partial command name).\n if (self.autocompleteState) {\n self.updateAutocomplete();\n }\n}\n\nexport function do_pageScroll(self: Editor, direction: -1 | 1): void {\n self.lastAction = null;\n const terminalRows = self.tui.terminal.rows;\n const pageSize = Math.max(5, Math.floor(terminalRows * 0.3));\n\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n const targetVisualLine = Math.max(0, Math.min(visualLines.length - 1, currentVisualLine + direction * pageSize));\n\n self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n}\n\nexport function do_moveWordBackwards(self: Editor): void {\n self.lastAction = null;\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n\n // If at start of line, move to end of previous line\n if (self.state.cursorCol === 0) {\n if (self.state.cursorLine > 0) {\n self.state.cursorLine--;\n const prevLine = self.state.lines[self.state.cursorLine] || \"\";\n self.setCursorCol(prevLine.length);\n }\n return;\n }\n\n self.setCursorCol(\n findWordBackward(currentLine, self.state.cursorCol, {\n segment: (text) => self.segment(text, \"word\"),\n isAtomicSegment: isPasteMarker,\n }),\n );\n}\n\nexport function do_yank(self: Editor): void {\n if (self.killRing.length === 0) return;\n\n self.pushUndoSnapshot();\n\n const text = self.killRing.peek()!;\n self.insertYankedText(text);\n\n self.lastAction = \"yank\";\n}\n\nexport function do_yankPop(self: Editor): void {\n // Only works if we just yanked and have more than one entry\n if (self.lastAction !== \"yank\" || self.killRing.length <= 1) return;\n\n self.pushUndoSnapshot();\n\n // Delete the previously yanked text (still at end of ring before rotation)\n self.deleteYankedText();\n\n // Rotate the ring: move end to front\n self.killRing.rotate();\n\n // Insert the new most recent entry (now at end after rotation)\n const text = self.killRing.peek()!;\n self.insertYankedText(text);\n\n self.lastAction = \"yank\";\n}\n"]}
@@ -0,0 +1,112 @@
1
+ import { findWordBackward } from "../../../word-navigation.js";
2
+ import { isPasteMarker } from "../paste-marker.js";
3
+ export function do_moveCursor(self, deltaLine, deltaCol) {
4
+ self.lastAction = null;
5
+ const visualLines = self.buildVisualLineMap(self.lastWidth);
6
+ const currentVisualLine = self.findCurrentVisualLine(visualLines);
7
+ if (deltaLine !== 0) {
8
+ const targetVisualLine = currentVisualLine + deltaLine;
9
+ if (targetVisualLine >= 0 && targetVisualLine < visualLines.length) {
10
+ self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);
11
+ }
12
+ }
13
+ if (deltaCol !== 0) {
14
+ const currentLine = self.state.lines[self.state.cursorLine] || "";
15
+ if (deltaCol > 0) {
16
+ // Moving right - move by one grapheme (handles emojis, combining characters, etc.)
17
+ if (self.state.cursorCol < currentLine.length) {
18
+ const afterCursor = currentLine.slice(self.state.cursorCol);
19
+ const graphemes = [...self.segment(afterCursor, "grapheme")];
20
+ const firstGrapheme = graphemes[0];
21
+ self.setCursorCol(self.state.cursorCol + (firstGrapheme ? firstGrapheme.segment.length : 1));
22
+ }
23
+ else if (self.state.cursorLine < self.state.lines.length - 1) {
24
+ // Wrap to start of next logical line
25
+ self.state.cursorLine++;
26
+ self.setCursorCol(0);
27
+ }
28
+ else {
29
+ // At end of last line - can't move, but set preferredVisualCol for up/down navigation
30
+ const currentVL = visualLines[currentVisualLine];
31
+ if (currentVL) {
32
+ self.preferredVisualCol = self.state.cursorCol - currentVL.startCol;
33
+ }
34
+ }
35
+ }
36
+ else {
37
+ // Moving left - move by one grapheme (handles emojis, combining characters, etc.)
38
+ if (self.state.cursorCol > 0) {
39
+ const beforeCursor = currentLine.slice(0, self.state.cursorCol);
40
+ const graphemes = [...self.segment(beforeCursor, "grapheme")];
41
+ const lastGrapheme = graphemes[graphemes.length - 1];
42
+ self.setCursorCol(self.state.cursorCol - (lastGrapheme ? lastGrapheme.segment.length : 1));
43
+ }
44
+ else if (self.state.cursorLine > 0) {
45
+ // Wrap to end of previous logical line
46
+ self.state.cursorLine--;
47
+ const prevLine = self.state.lines[self.state.cursorLine] || "";
48
+ self.setCursorCol(prevLine.length);
49
+ }
50
+ }
51
+ }
52
+ // Keep an open autocomplete picker in sync with the new cursor
53
+ // position: cursor movement changes the text before the cursor, so a
54
+ // picker computed for the old position is stale. Re-query so it
55
+ // refreshes — or closes when the new position yields no suggestions —
56
+ // mirroring insertCharacter()/handleBackspace(). Without self, arrowing
57
+ // left from `/cmd ` back into the command name leaves the argument
58
+ // picker showing against a `/cmd` prefix (and a Tab there would
59
+ // concatenate the stale suggestion onto the partial command name).
60
+ if (self.autocompleteState) {
61
+ self.updateAutocomplete();
62
+ }
63
+ }
64
+ export function do_pageScroll(self, direction) {
65
+ self.lastAction = null;
66
+ const terminalRows = self.tui.terminal.rows;
67
+ const pageSize = Math.max(5, Math.floor(terminalRows * 0.3));
68
+ const visualLines = self.buildVisualLineMap(self.lastWidth);
69
+ const currentVisualLine = self.findCurrentVisualLine(visualLines);
70
+ const targetVisualLine = Math.max(0, Math.min(visualLines.length - 1, currentVisualLine + direction * pageSize));
71
+ self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);
72
+ }
73
+ export function do_moveWordBackwards(self) {
74
+ self.lastAction = null;
75
+ const currentLine = self.state.lines[self.state.cursorLine] || "";
76
+ // If at start of line, move to end of previous line
77
+ if (self.state.cursorCol === 0) {
78
+ if (self.state.cursorLine > 0) {
79
+ self.state.cursorLine--;
80
+ const prevLine = self.state.lines[self.state.cursorLine] || "";
81
+ self.setCursorCol(prevLine.length);
82
+ }
83
+ return;
84
+ }
85
+ self.setCursorCol(findWordBackward(currentLine, self.state.cursorCol, {
86
+ segment: (text) => self.segment(text, "word"),
87
+ isAtomicSegment: isPasteMarker,
88
+ }));
89
+ }
90
+ export function do_yank(self) {
91
+ if (self.killRing.length === 0)
92
+ return;
93
+ self.pushUndoSnapshot();
94
+ const text = self.killRing.peek();
95
+ self.insertYankedText(text);
96
+ self.lastAction = "yank";
97
+ }
98
+ export function do_yankPop(self) {
99
+ // Only works if we just yanked and have more than one entry
100
+ if (self.lastAction !== "yank" || self.killRing.length <= 1)
101
+ return;
102
+ self.pushUndoSnapshot();
103
+ // Delete the previously yanked text (still at end of ring before rotation)
104
+ self.deleteYankedText();
105
+ // Rotate the ring: move end to front
106
+ self.killRing.rotate();
107
+ // Insert the new most recent entry (now at end after rotation)
108
+ const text = self.killRing.peek();
109
+ self.insertYankedText(text);
110
+ self.lastAction = "yank";
111
+ }
112
+ //# sourceMappingURL=cursor-movement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-movement.js","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/cursor-movement.ts"],"names":[],"mappings":"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","sourcesContent":["import { findWordBackward } from \"../../../word-navigation.ts\";\nimport type { Editor } from \"../editor.ts\";\nimport { isPasteMarker } from \"../paste-marker.ts\";\n\nexport function do_moveCursor(self: Editor, deltaLine: number, deltaCol: number): void {\n self.lastAction = null;\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n\n if (deltaLine !== 0) {\n const targetVisualLine = currentVisualLine + deltaLine;\n\n if (targetVisualLine >= 0 && targetVisualLine < visualLines.length) {\n self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n }\n }\n\n if (deltaCol !== 0) {\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n\n if (deltaCol > 0) {\n // Moving right - move by one grapheme (handles emojis, combining characters, etc.)\n if (self.state.cursorCol < currentLine.length) {\n const afterCursor = currentLine.slice(self.state.cursorCol);\n const graphemes = [...self.segment(afterCursor, \"grapheme\")];\n const firstGrapheme = graphemes[0];\n self.setCursorCol(self.state.cursorCol + (firstGrapheme ? firstGrapheme.segment.length : 1));\n } else if (self.state.cursorLine < self.state.lines.length - 1) {\n // Wrap to start of next logical line\n self.state.cursorLine++;\n self.setCursorCol(0);\n } else {\n // At end of last line - can't move, but set preferredVisualCol for up/down navigation\n const currentVL = visualLines[currentVisualLine];\n if (currentVL) {\n self.preferredVisualCol = self.state.cursorCol - currentVL.startCol;\n }\n }\n } else {\n // Moving left - move by one grapheme (handles emojis, combining characters, etc.)\n if (self.state.cursorCol > 0) {\n const beforeCursor = currentLine.slice(0, self.state.cursorCol);\n const graphemes = [...self.segment(beforeCursor, \"grapheme\")];\n const lastGrapheme = graphemes[graphemes.length - 1];\n self.setCursorCol(self.state.cursorCol - (lastGrapheme ? lastGrapheme.segment.length : 1));\n } else if (self.state.cursorLine > 0) {\n // Wrap to end of previous logical line\n self.state.cursorLine--;\n const prevLine = self.state.lines[self.state.cursorLine] || \"\";\n self.setCursorCol(prevLine.length);\n }\n }\n }\n\n // Keep an open autocomplete picker in sync with the new cursor\n // position: cursor movement changes the text before the cursor, so a\n // picker computed for the old position is stale. Re-query so it\n // refreshes — or closes when the new position yields no suggestions —\n // mirroring insertCharacter()/handleBackspace(). Without self, arrowing\n // left from `/cmd ` back into the command name leaves the argument\n // picker showing against a `/cmd` prefix (and a Tab there would\n // concatenate the stale suggestion onto the partial command name).\n if (self.autocompleteState) {\n self.updateAutocomplete();\n }\n}\n\nexport function do_pageScroll(self: Editor, direction: -1 | 1): void {\n self.lastAction = null;\n const terminalRows = self.tui.terminal.rows;\n const pageSize = Math.max(5, Math.floor(terminalRows * 0.3));\n\n const visualLines = self.buildVisualLineMap(self.lastWidth);\n const currentVisualLine = self.findCurrentVisualLine(visualLines);\n const targetVisualLine = Math.max(0, Math.min(visualLines.length - 1, currentVisualLine + direction * pageSize));\n\n self.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n}\n\nexport function do_moveWordBackwards(self: Editor): void {\n self.lastAction = null;\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n\n // If at start of line, move to end of previous line\n if (self.state.cursorCol === 0) {\n if (self.state.cursorLine > 0) {\n self.state.cursorLine--;\n const prevLine = self.state.lines[self.state.cursorLine] || \"\";\n self.setCursorCol(prevLine.length);\n }\n return;\n }\n\n self.setCursorCol(\n findWordBackward(currentLine, self.state.cursorCol, {\n segment: (text) => self.segment(text, \"word\"),\n isAtomicSegment: isPasteMarker,\n }),\n );\n}\n\nexport function do_yank(self: Editor): void {\n if (self.killRing.length === 0) return;\n\n self.pushUndoSnapshot();\n\n const text = self.killRing.peek()!;\n self.insertYankedText(text);\n\n self.lastAction = \"yank\";\n}\n\nexport function do_yankPop(self: Editor): void {\n // Only works if we just yanked and have more than one entry\n if (self.lastAction !== \"yank\" || self.killRing.length <= 1) return;\n\n self.pushUndoSnapshot();\n\n // Delete the previously yanked text (still at end of ring before rotation)\n self.deleteYankedText();\n\n // Rotate the ring: move end to front\n self.killRing.rotate();\n\n // Insert the new most recent entry (now at end after rotation)\n const text = self.killRing.peek()!;\n self.insertYankedText(text);\n\n self.lastAction = \"yank\";\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Editor } from "../editor.ts";
2
+ export declare function do_handleInput(self: Editor, data: string): void;
3
+ //# sourceMappingURL=input-handling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handling.d.ts","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/input-handling.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA6R/D","sourcesContent":["import { getKeybindings } from \"../../../keybindings.ts\";\nimport { decodePrintableKey, matchesKey } from \"../../../keys.ts\";\nimport type { Editor } from \"../editor.ts\";\n\nexport function do_handleInput(self: Editor, data: string): void {\n const kb = getKeybindings();\n\n // Handle character jump mode (awaiting next character to jump to)\n if (self.jumpMode !== null) {\n // Cancel if the hotkey is pressed again\n if (kb.matches(data, \"tui.editor.jumpForward\") || kb.matches(data, \"tui.editor.jumpBackward\")) {\n self.jumpMode = null;\n return;\n }\n\n const printable = decodePrintableKey(data) ?? (data.charCodeAt(0) >= 32 ? data : undefined);\n if (printable !== undefined) {\n // Printable character - perform the jump\n const direction = self.jumpMode;\n self.jumpMode = null;\n self.jumpToChar(printable, direction);\n return;\n }\n\n // Control character - cancel and fall through to normal handling\n self.jumpMode = null;\n }\n\n // Handle bracketed paste mode\n if (data.includes(\"\\x1b[200~\")) {\n self.isInPaste = true;\n self.pasteBuffer = \"\";\n data = data.replace(\"\\x1b[200~\", \"\");\n }\n\n if (self.isInPaste) {\n self.pasteBuffer += data;\n const endIndex = self.pasteBuffer.indexOf(\"\\x1b[201~\");\n if (endIndex !== -1) {\n const pasteContent = self.pasteBuffer.substring(0, endIndex);\n if (pasteContent.length > 0) {\n self.handlePaste(pasteContent);\n }\n self.isInPaste = false;\n const remaining = self.pasteBuffer.substring(endIndex + 6);\n self.pasteBuffer = \"\";\n if (remaining.length > 0) {\n self.handleInput(remaining);\n }\n return;\n }\n return;\n }\n\n // Ctrl+C - let parent handle (exit/clear)\n if (kb.matches(data, \"tui.input.copy\")) {\n return;\n }\n\n // Undo\n if (kb.matches(data, \"tui.editor.undo\")) {\n self.undo();\n return;\n }\n\n // Handle autocomplete mode\n if (self.autocompleteState && self.autocompleteList) {\n if (kb.matches(data, \"tui.select.cancel\")) {\n self.cancelAutocomplete();\n return;\n }\n\n if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n self.autocompleteList.handleInput(data);\n return;\n }\n\n if (kb.matches(data, \"tui.input.tab\")) {\n const selected = self.autocompleteList.getSelectedItem();\n if (selected && self.autocompleteProvider) {\n self.pushUndoSnapshot();\n self.lastAction = null;\n const result = self.autocompleteProvider.applyCompletion(\n self.state.lines,\n self.state.cursorLine,\n self.state.cursorCol,\n selected,\n self.autocompletePrefix,\n );\n self.state.lines = result.lines;\n self.state.cursorLine = result.cursorLine;\n self.setCursorCol(result.cursorCol);\n self.cancelAutocomplete();\n if (self.onChange) self.onChange(self.getText());\n }\n return;\n }\n\n if (kb.matches(data, \"tui.select.confirm\")) {\n const selected = self.autocompleteList.getSelectedItem();\n if (selected && self.autocompleteProvider) {\n self.pushUndoSnapshot();\n self.lastAction = null;\n const result = self.autocompleteProvider.applyCompletion(\n self.state.lines,\n self.state.cursorLine,\n self.state.cursorCol,\n selected,\n self.autocompletePrefix,\n );\n self.state.lines = result.lines;\n self.state.cursorLine = result.cursorLine;\n self.setCursorCol(result.cursorCol);\n\n if (self.autocompletePrefix.startsWith(\"/\")) {\n self.cancelAutocomplete();\n // Fall through to submit\n } else {\n self.cancelAutocomplete();\n if (self.onChange) self.onChange(self.getText());\n return;\n }\n }\n }\n }\n\n // Tab - trigger completion\n if (kb.matches(data, \"tui.input.tab\") && !self.autocompleteState) {\n self.handleTabCompletion();\n return;\n }\n\n // Deletion actions\n if (kb.matches(data, \"tui.editor.deleteToLineEnd\")) {\n self.deleteToEndOfLine();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteToLineStart\")) {\n self.deleteToStartOfLine();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteWordBackward\")) {\n self.deleteWordBackwards();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteWordForward\")) {\n self.deleteWordForward();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteCharBackward\") || matchesKey(data, \"shift+backspace\")) {\n self.handleBackspace();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteCharForward\") || matchesKey(data, \"shift+delete\")) {\n self.handleForwardDelete();\n return;\n }\n\n // Kill ring actions\n if (kb.matches(data, \"tui.editor.yank\")) {\n self.yank();\n return;\n }\n if (kb.matches(data, \"tui.editor.yankPop\")) {\n self.yankPop();\n return;\n }\n\n // Cursor movement actions\n if (kb.matches(data, \"tui.editor.cursorLineStart\")) {\n self.moveToLineStart();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorLineEnd\")) {\n self.moveToLineEnd();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorWordLeft\")) {\n self.moveWordBackwards();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorWordRight\")) {\n self.moveWordForwards();\n return;\n }\n\n // New line\n if (\n kb.matches(data, \"tui.input.newLine\") ||\n (data.charCodeAt(0) === 10 && data.length > 1) ||\n data === \"\\x1b\\r\" ||\n data === \"\\x1b[13;2~\" ||\n (data.length > 1 && data.includes(\"\\x1b\") && data.includes(\"\\r\")) ||\n (data === \"\\n\" && data.length === 1)\n ) {\n if (self.shouldSubmitOnBackslashEnter(data, kb)) {\n self.handleBackspace();\n self.submitValue();\n return;\n }\n self.addNewLine();\n return;\n }\n\n // Submit (Enter)\n if (kb.matches(data, \"tui.input.submit\")) {\n if (self.disableSubmit) return;\n\n // Workaround for terminals without Shift+Enter support:\n // If char before cursor is \\, delete it and insert newline instead of submitting.\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n if (self.state.cursorCol > 0 && currentLine[self.state.cursorCol - 1] === \"\\\\\") {\n self.handleBackspace();\n self.addNewLine();\n return;\n }\n\n self.submitValue();\n return;\n }\n\n // Arrow key navigation (with history support)\n if (kb.matches(data, \"tui.editor.cursorUp\")) {\n if (self.isOnFirstVisualLine() && self.history.length > 0) {\n self.navigateHistory(-1);\n } else if (self.isOnFirstVisualLine()) {\n // Already at top - jump to start of line\n self.moveToLineStart();\n } else {\n self.moveCursor(-1, 0);\n }\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorDown\")) {\n if (self.historyIndex > -1 && self.isOnLastVisualLine()) {\n self.navigateHistory(1);\n } else if (self.isOnLastVisualLine()) {\n // Already at bottom - jump to end of line\n self.moveToLineEnd();\n } else {\n self.moveCursor(1, 0);\n }\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorRight\")) {\n self.moveCursor(0, 1);\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorLeft\")) {\n self.moveCursor(0, -1);\n return;\n }\n\n // Page up/down - scroll by page and move cursor\n if (kb.matches(data, \"tui.editor.pageUp\")) {\n self.pageScroll(-1);\n return;\n }\n if (kb.matches(data, \"tui.editor.pageDown\")) {\n self.pageScroll(1);\n return;\n }\n\n // Character jump mode triggers\n if (kb.matches(data, \"tui.editor.jumpForward\")) {\n self.jumpMode = \"forward\";\n return;\n }\n if (kb.matches(data, \"tui.editor.jumpBackward\")) {\n self.jumpMode = \"backward\";\n return;\n }\n\n // Shift+Space - insert regular space\n if (matchesKey(data, \"shift+space\")) {\n self.insertCharacter(\" \");\n return;\n }\n\n const printable = decodePrintableKey(data);\n if (printable !== undefined) {\n self.insertCharacter(printable);\n return;\n }\n\n // Regular characters\n if (data.charCodeAt(0) >= 32) {\n self.insertCharacter(data);\n }\n}\n"]}
@@ -0,0 +1,257 @@
1
+ import { getKeybindings } from "../../../keybindings.js";
2
+ import { decodePrintableKey, matchesKey } from "../../../keys.js";
3
+ export function do_handleInput(self, data) {
4
+ const kb = getKeybindings();
5
+ // Handle character jump mode (awaiting next character to jump to)
6
+ if (self.jumpMode !== null) {
7
+ // Cancel if the hotkey is pressed again
8
+ if (kb.matches(data, "tui.editor.jumpForward") || kb.matches(data, "tui.editor.jumpBackward")) {
9
+ self.jumpMode = null;
10
+ return;
11
+ }
12
+ const printable = decodePrintableKey(data) ?? (data.charCodeAt(0) >= 32 ? data : undefined);
13
+ if (printable !== undefined) {
14
+ // Printable character - perform the jump
15
+ const direction = self.jumpMode;
16
+ self.jumpMode = null;
17
+ self.jumpToChar(printable, direction);
18
+ return;
19
+ }
20
+ // Control character - cancel and fall through to normal handling
21
+ self.jumpMode = null;
22
+ }
23
+ // Handle bracketed paste mode
24
+ if (data.includes("\x1b[200~")) {
25
+ self.isInPaste = true;
26
+ self.pasteBuffer = "";
27
+ data = data.replace("\x1b[200~", "");
28
+ }
29
+ if (self.isInPaste) {
30
+ self.pasteBuffer += data;
31
+ const endIndex = self.pasteBuffer.indexOf("\x1b[201~");
32
+ if (endIndex !== -1) {
33
+ const pasteContent = self.pasteBuffer.substring(0, endIndex);
34
+ if (pasteContent.length > 0) {
35
+ self.handlePaste(pasteContent);
36
+ }
37
+ self.isInPaste = false;
38
+ const remaining = self.pasteBuffer.substring(endIndex + 6);
39
+ self.pasteBuffer = "";
40
+ if (remaining.length > 0) {
41
+ self.handleInput(remaining);
42
+ }
43
+ return;
44
+ }
45
+ return;
46
+ }
47
+ // Ctrl+C - let parent handle (exit/clear)
48
+ if (kb.matches(data, "tui.input.copy")) {
49
+ return;
50
+ }
51
+ // Undo
52
+ if (kb.matches(data, "tui.editor.undo")) {
53
+ self.undo();
54
+ return;
55
+ }
56
+ // Handle autocomplete mode
57
+ if (self.autocompleteState && self.autocompleteList) {
58
+ if (kb.matches(data, "tui.select.cancel")) {
59
+ self.cancelAutocomplete();
60
+ return;
61
+ }
62
+ if (kb.matches(data, "tui.select.up") || kb.matches(data, "tui.select.down")) {
63
+ self.autocompleteList.handleInput(data);
64
+ return;
65
+ }
66
+ if (kb.matches(data, "tui.input.tab")) {
67
+ const selected = self.autocompleteList.getSelectedItem();
68
+ if (selected && self.autocompleteProvider) {
69
+ self.pushUndoSnapshot();
70
+ self.lastAction = null;
71
+ const result = self.autocompleteProvider.applyCompletion(self.state.lines, self.state.cursorLine, self.state.cursorCol, selected, self.autocompletePrefix);
72
+ self.state.lines = result.lines;
73
+ self.state.cursorLine = result.cursorLine;
74
+ self.setCursorCol(result.cursorCol);
75
+ self.cancelAutocomplete();
76
+ if (self.onChange)
77
+ self.onChange(self.getText());
78
+ }
79
+ return;
80
+ }
81
+ if (kb.matches(data, "tui.select.confirm")) {
82
+ const selected = self.autocompleteList.getSelectedItem();
83
+ if (selected && self.autocompleteProvider) {
84
+ self.pushUndoSnapshot();
85
+ self.lastAction = null;
86
+ const result = self.autocompleteProvider.applyCompletion(self.state.lines, self.state.cursorLine, self.state.cursorCol, selected, self.autocompletePrefix);
87
+ self.state.lines = result.lines;
88
+ self.state.cursorLine = result.cursorLine;
89
+ self.setCursorCol(result.cursorCol);
90
+ if (self.autocompletePrefix.startsWith("/")) {
91
+ self.cancelAutocomplete();
92
+ // Fall through to submit
93
+ }
94
+ else {
95
+ self.cancelAutocomplete();
96
+ if (self.onChange)
97
+ self.onChange(self.getText());
98
+ return;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // Tab - trigger completion
104
+ if (kb.matches(data, "tui.input.tab") && !self.autocompleteState) {
105
+ self.handleTabCompletion();
106
+ return;
107
+ }
108
+ // Deletion actions
109
+ if (kb.matches(data, "tui.editor.deleteToLineEnd")) {
110
+ self.deleteToEndOfLine();
111
+ return;
112
+ }
113
+ if (kb.matches(data, "tui.editor.deleteToLineStart")) {
114
+ self.deleteToStartOfLine();
115
+ return;
116
+ }
117
+ if (kb.matches(data, "tui.editor.deleteWordBackward")) {
118
+ self.deleteWordBackwards();
119
+ return;
120
+ }
121
+ if (kb.matches(data, "tui.editor.deleteWordForward")) {
122
+ self.deleteWordForward();
123
+ return;
124
+ }
125
+ if (kb.matches(data, "tui.editor.deleteCharBackward") || matchesKey(data, "shift+backspace")) {
126
+ self.handleBackspace();
127
+ return;
128
+ }
129
+ if (kb.matches(data, "tui.editor.deleteCharForward") || matchesKey(data, "shift+delete")) {
130
+ self.handleForwardDelete();
131
+ return;
132
+ }
133
+ // Kill ring actions
134
+ if (kb.matches(data, "tui.editor.yank")) {
135
+ self.yank();
136
+ return;
137
+ }
138
+ if (kb.matches(data, "tui.editor.yankPop")) {
139
+ self.yankPop();
140
+ return;
141
+ }
142
+ // Cursor movement actions
143
+ if (kb.matches(data, "tui.editor.cursorLineStart")) {
144
+ self.moveToLineStart();
145
+ return;
146
+ }
147
+ if (kb.matches(data, "tui.editor.cursorLineEnd")) {
148
+ self.moveToLineEnd();
149
+ return;
150
+ }
151
+ if (kb.matches(data, "tui.editor.cursorWordLeft")) {
152
+ self.moveWordBackwards();
153
+ return;
154
+ }
155
+ if (kb.matches(data, "tui.editor.cursorWordRight")) {
156
+ self.moveWordForwards();
157
+ return;
158
+ }
159
+ // New line
160
+ if (kb.matches(data, "tui.input.newLine") ||
161
+ (data.charCodeAt(0) === 10 && data.length > 1) ||
162
+ data === "\x1b\r" ||
163
+ data === "\x1b[13;2~" ||
164
+ (data.length > 1 && data.includes("\x1b") && data.includes("\r")) ||
165
+ (data === "\n" && data.length === 1)) {
166
+ if (self.shouldSubmitOnBackslashEnter(data, kb)) {
167
+ self.handleBackspace();
168
+ self.submitValue();
169
+ return;
170
+ }
171
+ self.addNewLine();
172
+ return;
173
+ }
174
+ // Submit (Enter)
175
+ if (kb.matches(data, "tui.input.submit")) {
176
+ if (self.disableSubmit)
177
+ return;
178
+ // Workaround for terminals without Shift+Enter support:
179
+ // If char before cursor is \, delete it and insert newline instead of submitting.
180
+ const currentLine = self.state.lines[self.state.cursorLine] || "";
181
+ if (self.state.cursorCol > 0 && currentLine[self.state.cursorCol - 1] === "\\") {
182
+ self.handleBackspace();
183
+ self.addNewLine();
184
+ return;
185
+ }
186
+ self.submitValue();
187
+ return;
188
+ }
189
+ // Arrow key navigation (with history support)
190
+ if (kb.matches(data, "tui.editor.cursorUp")) {
191
+ if (self.isOnFirstVisualLine() && self.history.length > 0) {
192
+ self.navigateHistory(-1);
193
+ }
194
+ else if (self.isOnFirstVisualLine()) {
195
+ // Already at top - jump to start of line
196
+ self.moveToLineStart();
197
+ }
198
+ else {
199
+ self.moveCursor(-1, 0);
200
+ }
201
+ return;
202
+ }
203
+ if (kb.matches(data, "tui.editor.cursorDown")) {
204
+ if (self.historyIndex > -1 && self.isOnLastVisualLine()) {
205
+ self.navigateHistory(1);
206
+ }
207
+ else if (self.isOnLastVisualLine()) {
208
+ // Already at bottom - jump to end of line
209
+ self.moveToLineEnd();
210
+ }
211
+ else {
212
+ self.moveCursor(1, 0);
213
+ }
214
+ return;
215
+ }
216
+ if (kb.matches(data, "tui.editor.cursorRight")) {
217
+ self.moveCursor(0, 1);
218
+ return;
219
+ }
220
+ if (kb.matches(data, "tui.editor.cursorLeft")) {
221
+ self.moveCursor(0, -1);
222
+ return;
223
+ }
224
+ // Page up/down - scroll by page and move cursor
225
+ if (kb.matches(data, "tui.editor.pageUp")) {
226
+ self.pageScroll(-1);
227
+ return;
228
+ }
229
+ if (kb.matches(data, "tui.editor.pageDown")) {
230
+ self.pageScroll(1);
231
+ return;
232
+ }
233
+ // Character jump mode triggers
234
+ if (kb.matches(data, "tui.editor.jumpForward")) {
235
+ self.jumpMode = "forward";
236
+ return;
237
+ }
238
+ if (kb.matches(data, "tui.editor.jumpBackward")) {
239
+ self.jumpMode = "backward";
240
+ return;
241
+ }
242
+ // Shift+Space - insert regular space
243
+ if (matchesKey(data, "shift+space")) {
244
+ self.insertCharacter(" ");
245
+ return;
246
+ }
247
+ const printable = decodePrintableKey(data);
248
+ if (printable !== undefined) {
249
+ self.insertCharacter(printable);
250
+ return;
251
+ }
252
+ // Regular characters
253
+ if (data.charCodeAt(0) >= 32) {
254
+ self.insertCharacter(data);
255
+ }
256
+ }
257
+ //# sourceMappingURL=input-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handling.js","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/input-handling.ts"],"names":[],"mappings":"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","sourcesContent":["import { getKeybindings } from \"../../../keybindings.ts\";\nimport { decodePrintableKey, matchesKey } from \"../../../keys.ts\";\nimport type { Editor } from \"../editor.ts\";\n\nexport function do_handleInput(self: Editor, data: string): void {\n const kb = getKeybindings();\n\n // Handle character jump mode (awaiting next character to jump to)\n if (self.jumpMode !== null) {\n // Cancel if the hotkey is pressed again\n if (kb.matches(data, \"tui.editor.jumpForward\") || kb.matches(data, \"tui.editor.jumpBackward\")) {\n self.jumpMode = null;\n return;\n }\n\n const printable = decodePrintableKey(data) ?? (data.charCodeAt(0) >= 32 ? data : undefined);\n if (printable !== undefined) {\n // Printable character - perform the jump\n const direction = self.jumpMode;\n self.jumpMode = null;\n self.jumpToChar(printable, direction);\n return;\n }\n\n // Control character - cancel and fall through to normal handling\n self.jumpMode = null;\n }\n\n // Handle bracketed paste mode\n if (data.includes(\"\\x1b[200~\")) {\n self.isInPaste = true;\n self.pasteBuffer = \"\";\n data = data.replace(\"\\x1b[200~\", \"\");\n }\n\n if (self.isInPaste) {\n self.pasteBuffer += data;\n const endIndex = self.pasteBuffer.indexOf(\"\\x1b[201~\");\n if (endIndex !== -1) {\n const pasteContent = self.pasteBuffer.substring(0, endIndex);\n if (pasteContent.length > 0) {\n self.handlePaste(pasteContent);\n }\n self.isInPaste = false;\n const remaining = self.pasteBuffer.substring(endIndex + 6);\n self.pasteBuffer = \"\";\n if (remaining.length > 0) {\n self.handleInput(remaining);\n }\n return;\n }\n return;\n }\n\n // Ctrl+C - let parent handle (exit/clear)\n if (kb.matches(data, \"tui.input.copy\")) {\n return;\n }\n\n // Undo\n if (kb.matches(data, \"tui.editor.undo\")) {\n self.undo();\n return;\n }\n\n // Handle autocomplete mode\n if (self.autocompleteState && self.autocompleteList) {\n if (kb.matches(data, \"tui.select.cancel\")) {\n self.cancelAutocomplete();\n return;\n }\n\n if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n self.autocompleteList.handleInput(data);\n return;\n }\n\n if (kb.matches(data, \"tui.input.tab\")) {\n const selected = self.autocompleteList.getSelectedItem();\n if (selected && self.autocompleteProvider) {\n self.pushUndoSnapshot();\n self.lastAction = null;\n const result = self.autocompleteProvider.applyCompletion(\n self.state.lines,\n self.state.cursorLine,\n self.state.cursorCol,\n selected,\n self.autocompletePrefix,\n );\n self.state.lines = result.lines;\n self.state.cursorLine = result.cursorLine;\n self.setCursorCol(result.cursorCol);\n self.cancelAutocomplete();\n if (self.onChange) self.onChange(self.getText());\n }\n return;\n }\n\n if (kb.matches(data, \"tui.select.confirm\")) {\n const selected = self.autocompleteList.getSelectedItem();\n if (selected && self.autocompleteProvider) {\n self.pushUndoSnapshot();\n self.lastAction = null;\n const result = self.autocompleteProvider.applyCompletion(\n self.state.lines,\n self.state.cursorLine,\n self.state.cursorCol,\n selected,\n self.autocompletePrefix,\n );\n self.state.lines = result.lines;\n self.state.cursorLine = result.cursorLine;\n self.setCursorCol(result.cursorCol);\n\n if (self.autocompletePrefix.startsWith(\"/\")) {\n self.cancelAutocomplete();\n // Fall through to submit\n } else {\n self.cancelAutocomplete();\n if (self.onChange) self.onChange(self.getText());\n return;\n }\n }\n }\n }\n\n // Tab - trigger completion\n if (kb.matches(data, \"tui.input.tab\") && !self.autocompleteState) {\n self.handleTabCompletion();\n return;\n }\n\n // Deletion actions\n if (kb.matches(data, \"tui.editor.deleteToLineEnd\")) {\n self.deleteToEndOfLine();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteToLineStart\")) {\n self.deleteToStartOfLine();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteWordBackward\")) {\n self.deleteWordBackwards();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteWordForward\")) {\n self.deleteWordForward();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteCharBackward\") || matchesKey(data, \"shift+backspace\")) {\n self.handleBackspace();\n return;\n }\n if (kb.matches(data, \"tui.editor.deleteCharForward\") || matchesKey(data, \"shift+delete\")) {\n self.handleForwardDelete();\n return;\n }\n\n // Kill ring actions\n if (kb.matches(data, \"tui.editor.yank\")) {\n self.yank();\n return;\n }\n if (kb.matches(data, \"tui.editor.yankPop\")) {\n self.yankPop();\n return;\n }\n\n // Cursor movement actions\n if (kb.matches(data, \"tui.editor.cursorLineStart\")) {\n self.moveToLineStart();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorLineEnd\")) {\n self.moveToLineEnd();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorWordLeft\")) {\n self.moveWordBackwards();\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorWordRight\")) {\n self.moveWordForwards();\n return;\n }\n\n // New line\n if (\n kb.matches(data, \"tui.input.newLine\") ||\n (data.charCodeAt(0) === 10 && data.length > 1) ||\n data === \"\\x1b\\r\" ||\n data === \"\\x1b[13;2~\" ||\n (data.length > 1 && data.includes(\"\\x1b\") && data.includes(\"\\r\")) ||\n (data === \"\\n\" && data.length === 1)\n ) {\n if (self.shouldSubmitOnBackslashEnter(data, kb)) {\n self.handleBackspace();\n self.submitValue();\n return;\n }\n self.addNewLine();\n return;\n }\n\n // Submit (Enter)\n if (kb.matches(data, \"tui.input.submit\")) {\n if (self.disableSubmit) return;\n\n // Workaround for terminals without Shift+Enter support:\n // If char before cursor is \\, delete it and insert newline instead of submitting.\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n if (self.state.cursorCol > 0 && currentLine[self.state.cursorCol - 1] === \"\\\\\") {\n self.handleBackspace();\n self.addNewLine();\n return;\n }\n\n self.submitValue();\n return;\n }\n\n // Arrow key navigation (with history support)\n if (kb.matches(data, \"tui.editor.cursorUp\")) {\n if (self.isOnFirstVisualLine() && self.history.length > 0) {\n self.navigateHistory(-1);\n } else if (self.isOnFirstVisualLine()) {\n // Already at top - jump to start of line\n self.moveToLineStart();\n } else {\n self.moveCursor(-1, 0);\n }\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorDown\")) {\n if (self.historyIndex > -1 && self.isOnLastVisualLine()) {\n self.navigateHistory(1);\n } else if (self.isOnLastVisualLine()) {\n // Already at bottom - jump to end of line\n self.moveToLineEnd();\n } else {\n self.moveCursor(1, 0);\n }\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorRight\")) {\n self.moveCursor(0, 1);\n return;\n }\n if (kb.matches(data, \"tui.editor.cursorLeft\")) {\n self.moveCursor(0, -1);\n return;\n }\n\n // Page up/down - scroll by page and move cursor\n if (kb.matches(data, \"tui.editor.pageUp\")) {\n self.pageScroll(-1);\n return;\n }\n if (kb.matches(data, \"tui.editor.pageDown\")) {\n self.pageScroll(1);\n return;\n }\n\n // Character jump mode triggers\n if (kb.matches(data, \"tui.editor.jumpForward\")) {\n self.jumpMode = \"forward\";\n return;\n }\n if (kb.matches(data, \"tui.editor.jumpBackward\")) {\n self.jumpMode = \"backward\";\n return;\n }\n\n // Shift+Space - insert regular space\n if (matchesKey(data, \"shift+space\")) {\n self.insertCharacter(\" \");\n return;\n }\n\n const printable = decodePrintableKey(data);\n if (printable !== undefined) {\n self.insertCharacter(printable);\n return;\n }\n\n // Regular characters\n if (data.charCodeAt(0) >= 32) {\n self.insertCharacter(data);\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { getKeybindings } from "../../../keybindings.ts";
2
+ import type { Editor } from "../editor.ts";
3
+ export declare function do_handlePaste(self: Editor, pastedText: string): void;
4
+ export declare function do_addNewLine(self: Editor): void;
5
+ export declare function do_shouldSubmitOnBackslashEnter(self: Editor, data: string, kb: ReturnType<typeof getKeybindings>): boolean;
6
+ export declare function do_submitValue(self: Editor): void;
7
+ //# sourceMappingURL=paste-submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-submit.d.ts","sourceRoot":"","sources":["../../../../src/components/editor/editor-methods/paste-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkErE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAuBhD;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,GACpC,OAAO,CAST;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAcjD","sourcesContent":["import type { getKeybindings } from \"../../../keybindings.ts\";\nimport { matchesKey } from \"../../../keys.ts\";\nimport type { Editor } from \"../editor.ts\";\n\nexport function do_handlePaste(self: Editor, pastedText: string): void {\n self.cancelAutocomplete();\n self.exitHistoryBrowsing();\n self.lastAction = null;\n\n self.pushUndoSnapshot();\n\n // Some terminals (e.g. tmux popups with extended-keys-format=csi-u) re-encode\n // control bytes inside bracketed paste as CSI-u Ctrl+<letter> sequences\n // (ESC [ <codepoint> ; 5 u). Decode those back to their literal byte so the\n // per-char filter below preserves newlines instead of stripping ESC and\n // leaking the printable tail (e.g. \"[106;5u\") into the editor.\n const decodedText = pastedText.replace(/\\x1b\\[(\\d+);5u/g, (match, code) => {\n const cp = Number(code);\n if (cp >= 97 && cp <= 122) return String.fromCharCode(cp - 96);\n if (cp >= 65 && cp <= 90) return String.fromCharCode(cp - 64);\n return match;\n });\n\n // Clean the pasted text: normalize line endings, expand tabs\n const cleanText = self.normalizeText(decodedText);\n\n // Filter out non-printable characters except newlines\n let filteredText = cleanText\n .split(\"\")\n .filter((char) => char === \"\\n\" || char.charCodeAt(0) >= 32)\n .join(\"\");\n\n // If pasting a file path (starts with /, ~, or .) and the character before\n // the cursor is a word character, prepend a space for better readability\n if (/^[/~.]/.test(filteredText)) {\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n const charBeforeCursor = self.state.cursorCol > 0 ? currentLine[self.state.cursorCol - 1] : \"\";\n if (charBeforeCursor && /\\w/.test(charBeforeCursor)) {\n filteredText = ` ${filteredText}`;\n }\n }\n\n // Split into lines to check for large paste\n const pastedLines = filteredText.split(\"\\n\");\n\n // Check if self is a large paste (> 10 lines or > 1000 characters)\n const totalChars = filteredText.length;\n if (pastedLines.length > 10 || totalChars > 1000) {\n // Store the paste and insert a marker\n self.pasteCounter++;\n const pasteId = self.pasteCounter;\n self.pastes.set(pasteId, filteredText);\n\n // Insert marker like \"[paste #1 +123 lines]\" or \"[paste #1 1234 chars]\"\n const marker =\n pastedLines.length > 10\n ? `[paste #${pasteId} +${pastedLines.length} lines]`\n : `[paste #${pasteId} ${totalChars} chars]`;\n self.insertTextAtCursorInternal(marker);\n return;\n }\n\n if (pastedLines.length === 1) {\n // Single line - insert atomically (do not trigger autocomplete during paste)\n self.insertTextAtCursorInternal(filteredText);\n return;\n }\n\n // Multi-line paste - use direct state manipulation\n self.insertTextAtCursorInternal(filteredText);\n}\n\nexport function do_addNewLine(self: Editor): void {\n self.cancelAutocomplete();\n self.exitHistoryBrowsing();\n self.lastAction = null;\n\n self.pushUndoSnapshot();\n\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n\n const before = currentLine.slice(0, self.state.cursorCol);\n const after = currentLine.slice(self.state.cursorCol);\n\n // Split current line\n self.state.lines[self.state.cursorLine] = before;\n self.state.lines.splice(self.state.cursorLine + 1, 0, after);\n\n // Move cursor to start of new line\n self.state.cursorLine++;\n self.setCursorCol(0);\n\n if (self.onChange) {\n self.onChange(self.getText());\n }\n}\n\nexport function do_shouldSubmitOnBackslashEnter(\n self: Editor,\n data: string,\n kb: ReturnType<typeof getKeybindings>,\n): boolean {\n if (self.disableSubmit) return false;\n if (!matchesKey(data, \"enter\")) return false;\n const submitKeys = kb.getKeys(\"tui.input.submit\");\n const hasShiftEnter = submitKeys.includes(\"shift+enter\") || submitKeys.includes(\"shift+return\");\n if (!hasShiftEnter) return false;\n\n const currentLine = self.state.lines[self.state.cursorLine] || \"\";\n return self.state.cursorCol > 0 && currentLine[self.state.cursorCol - 1] === \"\\\\\";\n}\n\nexport function do_submitValue(self: Editor): void {\n self.cancelAutocomplete();\n const result = self.expandPasteMarkers(self.state.lines.join(\"\\n\")).trim();\n\n self.state = { lines: [\"\"], cursorLine: 0, cursorCol: 0 };\n self.pastes.clear();\n self.pasteCounter = 0;\n self.exitHistoryBrowsing();\n self.scrollOffset = 0;\n self.undoStack.clear();\n self.lastAction = null;\n\n if (self.onChange) self.onChange(\"\");\n if (self.onSubmit) self.onSubmit(result);\n}\n"]}