@vybestack/llxprt-code 0.1.14-nightly.250729.2076f7c6 → 0.1.15

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 (116) hide show
  1. package/README.md +53 -0
  2. package/dist/package.json +4 -5
  3. package/dist/src/config/extension.d.ts +1 -0
  4. package/dist/src/config/extension.js +4 -0
  5. package/dist/src/config/extension.js.map +1 -1
  6. package/dist/src/config/settings.d.ts +2 -1
  7. package/dist/src/config/settings.js.map +1 -1
  8. package/dist/src/gemini.d.ts +1 -0
  9. package/dist/src/gemini.js +35 -15
  10. package/dist/src/gemini.js.map +1 -1
  11. package/dist/src/generated/git-commit.d.ts +1 -1
  12. package/dist/src/generated/git-commit.js +1 -1
  13. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  14. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  15. package/dist/src/services/CommandService.d.ts +8 -4
  16. package/dist/src/services/CommandService.js +24 -8
  17. package/dist/src/services/CommandService.js.map +1 -1
  18. package/dist/src/services/FileCommandLoader.d.ts +15 -3
  19. package/dist/src/services/FileCommandLoader.js +94 -42
  20. package/dist/src/services/FileCommandLoader.js.map +1 -1
  21. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  22. package/dist/src/services/McpPromptLoader.js +192 -0
  23. package/dist/src/services/McpPromptLoader.js.map +1 -0
  24. package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
  25. package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
  26. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  27. package/dist/src/services/prompt-processors/types.d.ts +4 -0
  28. package/dist/src/services/prompt-processors/types.js +4 -0
  29. package/dist/src/services/prompt-processors/types.js.map +1 -1
  30. package/dist/src/ui/App.js +312 -195
  31. package/dist/src/ui/App.js.map +1 -1
  32. package/dist/src/ui/commands/chatCommand.js +39 -1
  33. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  34. package/dist/src/ui/commands/initCommand.d.ts +7 -0
  35. package/dist/src/ui/commands/initCommand.js +76 -0
  36. package/dist/src/ui/commands/initCommand.js.map +1 -0
  37. package/dist/src/ui/commands/mcpCommand.js +53 -8
  38. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  39. package/dist/src/ui/commands/types.d.ts +22 -3
  40. package/dist/src/ui/commands/types.js +1 -0
  41. package/dist/src/ui/commands/types.js.map +1 -1
  42. package/dist/src/ui/commands/vimCommand.js +0 -7
  43. package/dist/src/ui/commands/vimCommand.js.map +1 -1
  44. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +3 -3
  45. package/dist/src/ui/components/ContextSummaryDisplay.js +8 -8
  46. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  47. package/dist/src/ui/components/Footer.d.ts +1 -0
  48. package/dist/src/ui/components/Footer.js +2 -2
  49. package/dist/src/ui/components/Footer.js.map +1 -1
  50. package/dist/src/ui/components/Header.js +1 -1
  51. package/dist/src/ui/components/Header.js.map +1 -1
  52. package/dist/src/ui/components/Help.js +2 -2
  53. package/dist/src/ui/components/Help.js.map +1 -1
  54. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +4 -4
  55. package/dist/src/ui/components/IDEContextDetailDisplay.js +5 -7
  56. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
  57. package/dist/src/ui/components/InputPrompt.d.ts +2 -0
  58. package/dist/src/ui/components/InputPrompt.js +5 -1
  59. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  60. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
  61. package/dist/src/ui/components/ShellConfirmationDialog.js +45 -0
  62. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  63. package/dist/src/ui/components/Tips.js +1 -1
  64. package/dist/src/ui/components/Tips.js.map +1 -1
  65. package/dist/src/ui/components/shared/text-buffer.d.ts +270 -2
  66. package/dist/src/ui/components/shared/text-buffer.js +415 -70
  67. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  68. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  69. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  70. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  71. package/dist/src/ui/contexts/VimModeContext.js +2 -2
  72. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  73. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
  74. package/dist/src/ui/hooks/shellCommandProcessor.js +139 -200
  75. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  76. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +7 -3
  77. package/dist/src/ui/hooks/slashCommandProcessor.js +208 -129
  78. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  79. package/dist/src/ui/hooks/useCompletion.js +7 -2
  80. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  81. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  82. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  83. package/dist/src/ui/hooks/useGeminiStream.js +14 -2
  84. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  85. package/dist/src/ui/hooks/useKeypress.js +5 -2
  86. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  87. package/dist/src/ui/hooks/useReactToolScheduler.js +0 -1
  88. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  89. package/dist/src/ui/hooks/vim.d.ts +28 -0
  90. package/dist/src/ui/hooks/vim.js +630 -0
  91. package/dist/src/ui/hooks/vim.js.map +1 -0
  92. package/dist/src/ui/themes/theme-manager.js +10 -1
  93. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  94. package/dist/src/ui/themes/theme.d.ts +1 -0
  95. package/dist/src/ui/themes/theme.js +19 -4
  96. package/dist/src/ui/themes/theme.js.map +1 -1
  97. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  98. package/dist/src/ui/utils/textUtils.js +0 -22
  99. package/dist/src/ui/utils/textUtils.js.map +1 -1
  100. package/dist/src/ui/utils/updateCheck.d.ts +7 -1
  101. package/dist/src/ui/utils/updateCheck.js +17 -28
  102. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  103. package/dist/src/utils/events.d.ts +11 -0
  104. package/dist/src/utils/events.js +13 -0
  105. package/dist/src/utils/events.js.map +1 -0
  106. package/dist/src/utils/handleAutoUpdate.d.ts +10 -0
  107. package/dist/src/utils/handleAutoUpdate.js +97 -0
  108. package/dist/src/utils/handleAutoUpdate.js.map +1 -0
  109. package/dist/src/utils/installationInfo.d.ts +23 -0
  110. package/dist/src/utils/installationInfo.js +154 -0
  111. package/dist/src/utils/installationInfo.js.map +1 -0
  112. package/dist/src/utils/updateEventEmitter.d.ts +11 -0
  113. package/dist/src/utils/updateEventEmitter.js +12 -0
  114. package/dist/src/utils/updateEventEmitter.js.map +1 -0
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +4 -5
@@ -0,0 +1,630 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useCallback, useReducer, useEffect } from 'react';
7
+ import { useVimMode } from '../contexts/VimModeContext.js';
8
+ // Constants
9
+ const DIGIT_MULTIPLIER = 10;
10
+ const DEFAULT_COUNT = 1;
11
+ const DIGIT_1_TO_9 = /^[1-9]$/;
12
+ // Command types
13
+ const CMD_TYPES = {
14
+ DELETE_WORD_FORWARD: 'dw',
15
+ DELETE_WORD_BACKWARD: 'db',
16
+ DELETE_WORD_END: 'de',
17
+ CHANGE_WORD_FORWARD: 'cw',
18
+ CHANGE_WORD_BACKWARD: 'cb',
19
+ CHANGE_WORD_END: 'ce',
20
+ DELETE_CHAR: 'x',
21
+ DELETE_LINE: 'dd',
22
+ CHANGE_LINE: 'cc',
23
+ DELETE_TO_EOL: 'D',
24
+ CHANGE_TO_EOL: 'C',
25
+ CHANGE_MOVEMENT: {
26
+ LEFT: 'ch',
27
+ DOWN: 'cj',
28
+ UP: 'ck',
29
+ RIGHT: 'cl',
30
+ },
31
+ };
32
+ // Helper function to clear pending state
33
+ const createClearPendingState = () => ({
34
+ count: 0,
35
+ pendingOperator: null,
36
+ });
37
+ const initialVimState = {
38
+ mode: 'NORMAL',
39
+ count: 0,
40
+ pendingOperator: null,
41
+ lastCommand: null,
42
+ };
43
+ // Reducer function
44
+ const vimReducer = (state, action) => {
45
+ switch (action.type) {
46
+ case 'SET_MODE':
47
+ return { ...state, mode: action.mode };
48
+ case 'SET_COUNT':
49
+ return { ...state, count: action.count };
50
+ case 'INCREMENT_COUNT':
51
+ return { ...state, count: state.count * DIGIT_MULTIPLIER + action.digit };
52
+ case 'CLEAR_COUNT':
53
+ return { ...state, count: 0 };
54
+ case 'SET_PENDING_OPERATOR':
55
+ return { ...state, pendingOperator: action.operator };
56
+ case 'SET_LAST_COMMAND':
57
+ return { ...state, lastCommand: action.command };
58
+ case 'CLEAR_PENDING_STATES':
59
+ return {
60
+ ...state,
61
+ ...createClearPendingState(),
62
+ };
63
+ case 'ESCAPE_TO_NORMAL':
64
+ // Handle escape - clear all pending states (mode is updated via context)
65
+ return {
66
+ ...state,
67
+ ...createClearPendingState(),
68
+ };
69
+ default:
70
+ return state;
71
+ }
72
+ };
73
+ /**
74
+ * React hook that provides vim-style editing functionality for text input.
75
+ *
76
+ * Features:
77
+ * - Modal editing (INSERT/NORMAL modes)
78
+ * - Navigation: h,j,k,l,w,b,e,0,$,^,gg,G with count prefixes
79
+ * - Editing: x,a,i,o,O,A,I,d,c,D,C with count prefixes
80
+ * - Complex operations: dd,cc,dw,cw,db,cb,de,ce
81
+ * - Command repetition (.)
82
+ * - Settings persistence
83
+ *
84
+ * @param buffer - TextBuffer instance for text manipulation
85
+ * @param onSubmit - Optional callback for command submission
86
+ * @returns Object with vim state and input handler
87
+ */
88
+ export function useVim(buffer, onSubmit) {
89
+ const { vimEnabled, vimMode, setVimMode } = useVimMode();
90
+ const [state, dispatch] = useReducer(vimReducer, initialVimState);
91
+ // Sync vim mode from context to local state
92
+ useEffect(() => {
93
+ dispatch({ type: 'SET_MODE', mode: vimMode });
94
+ }, [vimMode]);
95
+ // Helper to update mode in both reducer and context
96
+ const updateMode = useCallback((mode) => {
97
+ setVimMode(mode);
98
+ dispatch({ type: 'SET_MODE', mode });
99
+ }, [setVimMode]);
100
+ // Helper functions using the reducer state
101
+ const getCurrentCount = useCallback(() => state.count || DEFAULT_COUNT, [state.count]);
102
+ /** Executes common commands to eliminate duplication in dot (.) repeat command */
103
+ const executeCommand = useCallback((cmdType, count) => {
104
+ switch (cmdType) {
105
+ case CMD_TYPES.DELETE_WORD_FORWARD: {
106
+ buffer.vimDeleteWordForward(count);
107
+ break;
108
+ }
109
+ case CMD_TYPES.DELETE_WORD_BACKWARD: {
110
+ buffer.vimDeleteWordBackward(count);
111
+ break;
112
+ }
113
+ case CMD_TYPES.DELETE_WORD_END: {
114
+ buffer.vimDeleteWordEnd(count);
115
+ break;
116
+ }
117
+ case CMD_TYPES.CHANGE_WORD_FORWARD: {
118
+ buffer.vimChangeWordForward(count);
119
+ updateMode('INSERT');
120
+ break;
121
+ }
122
+ case CMD_TYPES.CHANGE_WORD_BACKWARD: {
123
+ buffer.vimChangeWordBackward(count);
124
+ updateMode('INSERT');
125
+ break;
126
+ }
127
+ case CMD_TYPES.CHANGE_WORD_END: {
128
+ buffer.vimChangeWordEnd(count);
129
+ updateMode('INSERT');
130
+ break;
131
+ }
132
+ case CMD_TYPES.DELETE_CHAR: {
133
+ buffer.vimDeleteChar(count);
134
+ break;
135
+ }
136
+ case CMD_TYPES.DELETE_LINE: {
137
+ buffer.vimDeleteLine(count);
138
+ break;
139
+ }
140
+ case CMD_TYPES.CHANGE_LINE: {
141
+ buffer.vimChangeLine(count);
142
+ updateMode('INSERT');
143
+ break;
144
+ }
145
+ case CMD_TYPES.CHANGE_MOVEMENT.LEFT:
146
+ case CMD_TYPES.CHANGE_MOVEMENT.DOWN:
147
+ case CMD_TYPES.CHANGE_MOVEMENT.UP:
148
+ case CMD_TYPES.CHANGE_MOVEMENT.RIGHT: {
149
+ const movementMap = {
150
+ [CMD_TYPES.CHANGE_MOVEMENT.LEFT]: 'h',
151
+ [CMD_TYPES.CHANGE_MOVEMENT.DOWN]: 'j',
152
+ [CMD_TYPES.CHANGE_MOVEMENT.UP]: 'k',
153
+ [CMD_TYPES.CHANGE_MOVEMENT.RIGHT]: 'l',
154
+ };
155
+ const movementType = movementMap[cmdType];
156
+ if (movementType) {
157
+ buffer.vimChangeMovement(movementType, count);
158
+ updateMode('INSERT');
159
+ }
160
+ break;
161
+ }
162
+ case CMD_TYPES.DELETE_TO_EOL: {
163
+ buffer.vimDeleteToEndOfLine();
164
+ break;
165
+ }
166
+ case CMD_TYPES.CHANGE_TO_EOL: {
167
+ buffer.vimChangeToEndOfLine();
168
+ updateMode('INSERT');
169
+ break;
170
+ }
171
+ default:
172
+ return false;
173
+ }
174
+ return true;
175
+ }, [buffer, updateMode]);
176
+ /**
177
+ * Handles key input in INSERT mode
178
+ * @param normalizedKey - The normalized key input
179
+ * @returns boolean indicating if the key was handled
180
+ */
181
+ const handleInsertModeInput = useCallback((normalizedKey) => {
182
+ // Handle escape key immediately - switch to NORMAL mode on any escape
183
+ if (normalizedKey.name === 'escape') {
184
+ // Vim behavior: move cursor left when exiting insert mode (unless at beginning of line)
185
+ buffer.vimEscapeInsertMode();
186
+ dispatch({ type: 'ESCAPE_TO_NORMAL' });
187
+ updateMode('NORMAL');
188
+ return true;
189
+ }
190
+ // In INSERT mode, let InputPrompt handle completion keys and special commands
191
+ if (normalizedKey.name === 'tab' ||
192
+ (normalizedKey.name === 'return' && !normalizedKey.ctrl) ||
193
+ normalizedKey.name === 'up' ||
194
+ normalizedKey.name === 'down') {
195
+ return false; // Let InputPrompt handle completion
196
+ }
197
+ // Let InputPrompt handle Ctrl+V for clipboard image pasting
198
+ if (normalizedKey.ctrl && normalizedKey.name === 'v') {
199
+ return false; // Let InputPrompt handle clipboard functionality
200
+ }
201
+ // Special handling for Enter key to allow command submission (lower priority than completion)
202
+ if (normalizedKey.name === 'return' &&
203
+ !normalizedKey.ctrl &&
204
+ !normalizedKey.meta) {
205
+ if (buffer.text.trim() && onSubmit) {
206
+ // Handle command submission directly
207
+ const submittedValue = buffer.text;
208
+ buffer.setText('');
209
+ onSubmit(submittedValue);
210
+ return true;
211
+ }
212
+ return true; // Handled by vim (even if no onSubmit callback)
213
+ }
214
+ // useKeypress already provides the correct format for TextBuffer
215
+ buffer.handleInput(normalizedKey);
216
+ return true; // Handled by vim
217
+ }, [buffer, dispatch, updateMode, onSubmit]);
218
+ /**
219
+ * Normalizes key input to ensure all required properties are present
220
+ * @param key - Raw key input
221
+ * @returns Normalized key with all properties
222
+ */
223
+ const normalizeKey = useCallback((key) => ({
224
+ name: key.name || '',
225
+ sequence: key.sequence || '',
226
+ ctrl: key.ctrl || false,
227
+ meta: key.meta || false,
228
+ shift: key.shift || false,
229
+ paste: key.paste || false,
230
+ }), []);
231
+ /**
232
+ * Handles change movement commands (ch, cj, ck, cl)
233
+ * @param movement - The movement direction
234
+ * @returns boolean indicating if command was handled
235
+ */
236
+ const handleChangeMovement = useCallback((movement) => {
237
+ const count = getCurrentCount();
238
+ dispatch({ type: 'CLEAR_COUNT' });
239
+ buffer.vimChangeMovement(movement, count);
240
+ updateMode('INSERT');
241
+ const cmdTypeMap = {
242
+ h: CMD_TYPES.CHANGE_MOVEMENT.LEFT,
243
+ j: CMD_TYPES.CHANGE_MOVEMENT.DOWN,
244
+ k: CMD_TYPES.CHANGE_MOVEMENT.UP,
245
+ l: CMD_TYPES.CHANGE_MOVEMENT.RIGHT,
246
+ };
247
+ dispatch({
248
+ type: 'SET_LAST_COMMAND',
249
+ command: { type: cmdTypeMap[movement], count },
250
+ });
251
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: null });
252
+ return true;
253
+ }, [getCurrentCount, dispatch, buffer, updateMode]);
254
+ /**
255
+ * Handles operator-motion commands (dw/cw, db/cb, de/ce)
256
+ * @param operator - The operator type ('d' for delete, 'c' for change)
257
+ * @param motion - The motion type ('w', 'b', 'e')
258
+ * @returns boolean indicating if command was handled
259
+ */
260
+ const handleOperatorMotion = useCallback((operator, motion) => {
261
+ const count = getCurrentCount();
262
+ const commandMap = {
263
+ d: {
264
+ w: CMD_TYPES.DELETE_WORD_FORWARD,
265
+ b: CMD_TYPES.DELETE_WORD_BACKWARD,
266
+ e: CMD_TYPES.DELETE_WORD_END,
267
+ },
268
+ c: {
269
+ w: CMD_TYPES.CHANGE_WORD_FORWARD,
270
+ b: CMD_TYPES.CHANGE_WORD_BACKWARD,
271
+ e: CMD_TYPES.CHANGE_WORD_END,
272
+ },
273
+ };
274
+ const cmdType = commandMap[operator][motion];
275
+ executeCommand(cmdType, count);
276
+ dispatch({
277
+ type: 'SET_LAST_COMMAND',
278
+ command: { type: cmdType, count },
279
+ });
280
+ dispatch({ type: 'CLEAR_COUNT' });
281
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: null });
282
+ return true;
283
+ }, [getCurrentCount, executeCommand, dispatch]);
284
+ const handleInput = useCallback((key) => {
285
+ if (!vimEnabled) {
286
+ return false; // Let InputPrompt handle it
287
+ }
288
+ let normalizedKey;
289
+ try {
290
+ normalizedKey = normalizeKey(key);
291
+ }
292
+ catch (error) {
293
+ // Handle malformed key inputs gracefully
294
+ console.warn('Malformed key input in vim mode:', key, error);
295
+ return false;
296
+ }
297
+ // Handle INSERT mode
298
+ if (state.mode === 'INSERT') {
299
+ return handleInsertModeInput(normalizedKey);
300
+ }
301
+ // Handle NORMAL mode
302
+ if (state.mode === 'NORMAL') {
303
+ // Handle Escape key in NORMAL mode - clear all pending states
304
+ if (normalizedKey.name === 'escape') {
305
+ dispatch({ type: 'CLEAR_PENDING_STATES' });
306
+ return true; // Handled by vim
307
+ }
308
+ // Handle count input (numbers 1-9, and 0 if count > 0)
309
+ if (DIGIT_1_TO_9.test(normalizedKey.sequence) ||
310
+ (normalizedKey.sequence === '0' && state.count > 0)) {
311
+ dispatch({
312
+ type: 'INCREMENT_COUNT',
313
+ digit: parseInt(normalizedKey.sequence, 10),
314
+ });
315
+ return true; // Handled by vim
316
+ }
317
+ const repeatCount = getCurrentCount();
318
+ switch (normalizedKey.sequence) {
319
+ case 'h': {
320
+ // Check if this is part of a change command (ch)
321
+ if (state.pendingOperator === 'c') {
322
+ return handleChangeMovement('h');
323
+ }
324
+ // Normal left movement
325
+ buffer.vimMoveLeft(repeatCount);
326
+ dispatch({ type: 'CLEAR_COUNT' });
327
+ return true;
328
+ }
329
+ case 'j': {
330
+ // Check if this is part of a change command (cj)
331
+ if (state.pendingOperator === 'c') {
332
+ return handleChangeMovement('j');
333
+ }
334
+ // Normal down movement
335
+ buffer.vimMoveDown(repeatCount);
336
+ dispatch({ type: 'CLEAR_COUNT' });
337
+ return true;
338
+ }
339
+ case 'k': {
340
+ // Check if this is part of a change command (ck)
341
+ if (state.pendingOperator === 'c') {
342
+ return handleChangeMovement('k');
343
+ }
344
+ // Normal up movement
345
+ buffer.vimMoveUp(repeatCount);
346
+ dispatch({ type: 'CLEAR_COUNT' });
347
+ return true;
348
+ }
349
+ case 'l': {
350
+ // Check if this is part of a change command (cl)
351
+ if (state.pendingOperator === 'c') {
352
+ return handleChangeMovement('l');
353
+ }
354
+ // Normal right movement
355
+ buffer.vimMoveRight(repeatCount);
356
+ dispatch({ type: 'CLEAR_COUNT' });
357
+ return true;
358
+ }
359
+ case 'w': {
360
+ // Check if this is part of a delete or change command (dw/cw)
361
+ if (state.pendingOperator === 'd') {
362
+ return handleOperatorMotion('d', 'w');
363
+ }
364
+ if (state.pendingOperator === 'c') {
365
+ return handleOperatorMotion('c', 'w');
366
+ }
367
+ // Normal word movement
368
+ buffer.vimMoveWordForward(repeatCount);
369
+ dispatch({ type: 'CLEAR_COUNT' });
370
+ return true;
371
+ }
372
+ case 'b': {
373
+ // Check if this is part of a delete or change command (db/cb)
374
+ if (state.pendingOperator === 'd') {
375
+ return handleOperatorMotion('d', 'b');
376
+ }
377
+ if (state.pendingOperator === 'c') {
378
+ return handleOperatorMotion('c', 'b');
379
+ }
380
+ // Normal backward word movement
381
+ buffer.vimMoveWordBackward(repeatCount);
382
+ dispatch({ type: 'CLEAR_COUNT' });
383
+ return true;
384
+ }
385
+ case 'e': {
386
+ // Check if this is part of a delete or change command (de/ce)
387
+ if (state.pendingOperator === 'd') {
388
+ return handleOperatorMotion('d', 'e');
389
+ }
390
+ if (state.pendingOperator === 'c') {
391
+ return handleOperatorMotion('c', 'e');
392
+ }
393
+ // Normal word end movement
394
+ buffer.vimMoveWordEnd(repeatCount);
395
+ dispatch({ type: 'CLEAR_COUNT' });
396
+ return true;
397
+ }
398
+ case 'x': {
399
+ // Delete character under cursor
400
+ buffer.vimDeleteChar(repeatCount);
401
+ dispatch({
402
+ type: 'SET_LAST_COMMAND',
403
+ command: { type: CMD_TYPES.DELETE_CHAR, count: repeatCount },
404
+ });
405
+ dispatch({ type: 'CLEAR_COUNT' });
406
+ return true;
407
+ }
408
+ case 'i': {
409
+ // Enter INSERT mode at current position
410
+ buffer.vimInsertAtCursor();
411
+ updateMode('INSERT');
412
+ dispatch({ type: 'CLEAR_COUNT' });
413
+ return true;
414
+ }
415
+ case 'a': {
416
+ // Enter INSERT mode after current position
417
+ buffer.vimAppendAtCursor();
418
+ updateMode('INSERT');
419
+ dispatch({ type: 'CLEAR_COUNT' });
420
+ return true;
421
+ }
422
+ case 'o': {
423
+ // Insert new line after current line and enter INSERT mode
424
+ buffer.vimOpenLineBelow();
425
+ updateMode('INSERT');
426
+ dispatch({ type: 'CLEAR_COUNT' });
427
+ return true;
428
+ }
429
+ case 'O': {
430
+ // Insert new line before current line and enter INSERT mode
431
+ buffer.vimOpenLineAbove();
432
+ updateMode('INSERT');
433
+ dispatch({ type: 'CLEAR_COUNT' });
434
+ return true;
435
+ }
436
+ case '0': {
437
+ // Move to start of line
438
+ buffer.vimMoveToLineStart();
439
+ dispatch({ type: 'CLEAR_COUNT' });
440
+ return true;
441
+ }
442
+ case '$': {
443
+ // Move to end of line
444
+ buffer.vimMoveToLineEnd();
445
+ dispatch({ type: 'CLEAR_COUNT' });
446
+ return true;
447
+ }
448
+ case '^': {
449
+ // Move to first non-whitespace character
450
+ buffer.vimMoveToFirstNonWhitespace();
451
+ dispatch({ type: 'CLEAR_COUNT' });
452
+ return true;
453
+ }
454
+ case 'g': {
455
+ if (state.pendingOperator === 'g') {
456
+ // Second 'g' - go to first line (gg command)
457
+ buffer.vimMoveToFirstLine();
458
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: null });
459
+ }
460
+ else {
461
+ // First 'g' - wait for second g
462
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: 'g' });
463
+ }
464
+ dispatch({ type: 'CLEAR_COUNT' });
465
+ return true;
466
+ }
467
+ case 'G': {
468
+ if (state.count > 0) {
469
+ // Go to specific line number (1-based) when a count was provided
470
+ buffer.vimMoveToLine(state.count);
471
+ }
472
+ else {
473
+ // Go to last line when no count was provided
474
+ buffer.vimMoveToLastLine();
475
+ }
476
+ dispatch({ type: 'CLEAR_COUNT' });
477
+ return true;
478
+ }
479
+ case 'I': {
480
+ // Enter INSERT mode at start of line (first non-whitespace)
481
+ buffer.vimInsertAtLineStart();
482
+ updateMode('INSERT');
483
+ dispatch({ type: 'CLEAR_COUNT' });
484
+ return true;
485
+ }
486
+ case 'A': {
487
+ // Enter INSERT mode at end of line
488
+ buffer.vimAppendAtLineEnd();
489
+ updateMode('INSERT');
490
+ dispatch({ type: 'CLEAR_COUNT' });
491
+ return true;
492
+ }
493
+ case 'd': {
494
+ if (state.pendingOperator === 'd') {
495
+ // Second 'd' - delete N lines (dd command)
496
+ const repeatCount = getCurrentCount();
497
+ executeCommand(CMD_TYPES.DELETE_LINE, repeatCount);
498
+ dispatch({
499
+ type: 'SET_LAST_COMMAND',
500
+ command: { type: CMD_TYPES.DELETE_LINE, count: repeatCount },
501
+ });
502
+ dispatch({ type: 'CLEAR_COUNT' });
503
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: null });
504
+ }
505
+ else {
506
+ // First 'd' - wait for movement command
507
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: 'd' });
508
+ }
509
+ return true;
510
+ }
511
+ case 'c': {
512
+ if (state.pendingOperator === 'c') {
513
+ // Second 'c' - change N entire lines (cc command)
514
+ const repeatCount = getCurrentCount();
515
+ executeCommand(CMD_TYPES.CHANGE_LINE, repeatCount);
516
+ dispatch({
517
+ type: 'SET_LAST_COMMAND',
518
+ command: { type: CMD_TYPES.CHANGE_LINE, count: repeatCount },
519
+ });
520
+ dispatch({ type: 'CLEAR_COUNT' });
521
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: null });
522
+ }
523
+ else {
524
+ // First 'c' - wait for movement command
525
+ dispatch({ type: 'SET_PENDING_OPERATOR', operator: 'c' });
526
+ }
527
+ return true;
528
+ }
529
+ case 'D': {
530
+ // Delete from cursor to end of line (equivalent to d$)
531
+ executeCommand(CMD_TYPES.DELETE_TO_EOL, 1);
532
+ dispatch({
533
+ type: 'SET_LAST_COMMAND',
534
+ command: { type: CMD_TYPES.DELETE_TO_EOL, count: 1 },
535
+ });
536
+ dispatch({ type: 'CLEAR_COUNT' });
537
+ return true;
538
+ }
539
+ case 'C': {
540
+ // Change from cursor to end of line (equivalent to c$)
541
+ executeCommand(CMD_TYPES.CHANGE_TO_EOL, 1);
542
+ dispatch({
543
+ type: 'SET_LAST_COMMAND',
544
+ command: { type: CMD_TYPES.CHANGE_TO_EOL, count: 1 },
545
+ });
546
+ dispatch({ type: 'CLEAR_COUNT' });
547
+ return true;
548
+ }
549
+ case '.': {
550
+ // Repeat last command
551
+ if (state.lastCommand) {
552
+ const cmdData = state.lastCommand;
553
+ // All repeatable commands are now handled by executeCommand
554
+ executeCommand(cmdData.type, cmdData.count);
555
+ }
556
+ dispatch({ type: 'CLEAR_COUNT' });
557
+ return true;
558
+ }
559
+ default: {
560
+ // Check for arrow keys (they have different sequences but known names)
561
+ if (normalizedKey.name === 'left') {
562
+ // Left arrow - same as 'h'
563
+ if (state.pendingOperator === 'c') {
564
+ return handleChangeMovement('h');
565
+ }
566
+ // Normal left movement (same as 'h')
567
+ buffer.vimMoveLeft(repeatCount);
568
+ dispatch({ type: 'CLEAR_COUNT' });
569
+ return true;
570
+ }
571
+ if (normalizedKey.name === 'down') {
572
+ // Down arrow - same as 'j'
573
+ if (state.pendingOperator === 'c') {
574
+ return handleChangeMovement('j');
575
+ }
576
+ // Normal down movement (same as 'j')
577
+ buffer.vimMoveDown(repeatCount);
578
+ dispatch({ type: 'CLEAR_COUNT' });
579
+ return true;
580
+ }
581
+ if (normalizedKey.name === 'up') {
582
+ // Up arrow - same as 'k'
583
+ if (state.pendingOperator === 'c') {
584
+ return handleChangeMovement('k');
585
+ }
586
+ // Normal up movement (same as 'k')
587
+ buffer.vimMoveUp(repeatCount);
588
+ dispatch({ type: 'CLEAR_COUNT' });
589
+ return true;
590
+ }
591
+ if (normalizedKey.name === 'right') {
592
+ // Right arrow - same as 'l'
593
+ if (state.pendingOperator === 'c') {
594
+ return handleChangeMovement('l');
595
+ }
596
+ // Normal right movement (same as 'l')
597
+ buffer.vimMoveRight(repeatCount);
598
+ dispatch({ type: 'CLEAR_COUNT' });
599
+ return true;
600
+ }
601
+ // Unknown command, clear count and pending states
602
+ dispatch({ type: 'CLEAR_PENDING_STATES' });
603
+ return true; // Still handled by vim to prevent other handlers
604
+ }
605
+ }
606
+ }
607
+ return false; // Not handled by vim
608
+ }, [
609
+ vimEnabled,
610
+ normalizeKey,
611
+ handleInsertModeInput,
612
+ state.mode,
613
+ state.count,
614
+ state.pendingOperator,
615
+ state.lastCommand,
616
+ dispatch,
617
+ getCurrentCount,
618
+ handleChangeMovement,
619
+ handleOperatorMotion,
620
+ buffer,
621
+ executeCommand,
622
+ updateMode,
623
+ ]);
624
+ return {
625
+ mode: state.mode,
626
+ vimModeEnabled: vimEnabled,
627
+ handleInput, // Expose the input handler for InputPrompt to use
628
+ };
629
+ }
630
+ //# sourceMappingURL=vim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vim.js","sourceRoot":"","sources":["../../../../src/ui/hooks/vim.ts"],"names":[],"mappings":"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"}