Skip to content

Commit 2aee830

Browse files
authored
feat(ui): add missing vim mode motions (X, ~, r, f/F/t/T, df/dt and friends) (google-gemini#21932)
1 parent afc43d9 commit 2aee830

5 files changed

Lines changed: 1307 additions & 9 deletions

File tree

packages/cli/src/ui/components/shared/text-buffer.ts

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,6 +1703,25 @@ export type TextBufferAction =
17031703
| { type: 'vim_change_to_first_nonwhitespace' }
17041704
| { type: 'vim_delete_to_first_line'; payload: { count: number } }
17051705
| { type: 'vim_delete_to_last_line'; payload: { count: number } }
1706+
| { type: 'vim_delete_char_before'; payload: { count: number } }
1707+
| { type: 'vim_toggle_case'; payload: { count: number } }
1708+
| { type: 'vim_replace_char'; payload: { char: string; count: number } }
1709+
| {
1710+
type: 'vim_find_char_forward';
1711+
payload: { char: string; count: number; till: boolean };
1712+
}
1713+
| {
1714+
type: 'vim_find_char_backward';
1715+
payload: { char: string; count: number; till: boolean };
1716+
}
1717+
| {
1718+
type: 'vim_delete_to_char_forward';
1719+
payload: { char: string; count: number; till: boolean };
1720+
}
1721+
| {
1722+
type: 'vim_delete_to_char_backward';
1723+
payload: { char: string; count: number; till: boolean };
1724+
}
17061725
| {
17071726
type: 'toggle_paste_expansion';
17081727
payload: { id: string; row: number; col: number };
@@ -2484,6 +2503,13 @@ function textBufferReducerLogic(
24842503
case 'vim_change_to_first_nonwhitespace':
24852504
case 'vim_delete_to_first_line':
24862505
case 'vim_delete_to_last_line':
2506+
case 'vim_delete_char_before':
2507+
case 'vim_toggle_case':
2508+
case 'vim_replace_char':
2509+
case 'vim_find_char_forward':
2510+
case 'vim_find_char_backward':
2511+
case 'vim_delete_to_char_forward':
2512+
case 'vim_delete_to_char_backward':
24872513
return handleVimAction(state, action as VimAction);
24882514

24892515
case 'toggle_paste_expansion': {
@@ -3043,6 +3069,58 @@ export function useTextBuffer({
30433069
dispatch({ type: 'vim_delete_char', payload: { count } });
30443070
}, []);
30453071

3072+
const vimDeleteCharBefore = useCallback((count: number): void => {
3073+
dispatch({ type: 'vim_delete_char_before', payload: { count } });
3074+
}, []);
3075+
3076+
const vimToggleCase = useCallback((count: number): void => {
3077+
dispatch({ type: 'vim_toggle_case', payload: { count } });
3078+
}, []);
3079+
3080+
const vimReplaceChar = useCallback((char: string, count: number): void => {
3081+
dispatch({ type: 'vim_replace_char', payload: { char, count } });
3082+
}, []);
3083+
3084+
const vimFindCharForward = useCallback(
3085+
(char: string, count: number, till: boolean): void => {
3086+
dispatch({
3087+
type: 'vim_find_char_forward',
3088+
payload: { char, count, till },
3089+
});
3090+
},
3091+
[],
3092+
);
3093+
3094+
const vimFindCharBackward = useCallback(
3095+
(char: string, count: number, till: boolean): void => {
3096+
dispatch({
3097+
type: 'vim_find_char_backward',
3098+
payload: { char, count, till },
3099+
});
3100+
},
3101+
[],
3102+
);
3103+
3104+
const vimDeleteToCharForward = useCallback(
3105+
(char: string, count: number, till: boolean): void => {
3106+
dispatch({
3107+
type: 'vim_delete_to_char_forward',
3108+
payload: { char, count, till },
3109+
});
3110+
},
3111+
[],
3112+
);
3113+
3114+
const vimDeleteToCharBackward = useCallback(
3115+
(char: string, count: number, till: boolean): void => {
3116+
dispatch({
3117+
type: 'vim_delete_to_char_backward',
3118+
payload: { char, count, till },
3119+
});
3120+
},
3121+
[],
3122+
);
3123+
30463124
const vimInsertAtCursor = useCallback((): void => {
30473125
dispatch({ type: 'vim_insert_at_cursor' });
30483126
}, []);
@@ -3542,6 +3620,13 @@ export function useTextBuffer({
35423620
vimMoveBigWordBackward,
35433621
vimMoveBigWordEnd,
35443622
vimDeleteChar,
3623+
vimDeleteCharBefore,
3624+
vimToggleCase,
3625+
vimReplaceChar,
3626+
vimFindCharForward,
3627+
vimFindCharBackward,
3628+
vimDeleteToCharForward,
3629+
vimDeleteToCharBackward,
35453630
vimInsertAtCursor,
35463631
vimAppendAtCursor,
35473632
vimOpenLineBelow,
@@ -3630,6 +3715,13 @@ export function useTextBuffer({
36303715
vimMoveBigWordBackward,
36313716
vimMoveBigWordEnd,
36323717
vimDeleteChar,
3718+
vimDeleteCharBefore,
3719+
vimToggleCase,
3720+
vimReplaceChar,
3721+
vimFindCharForward,
3722+
vimFindCharBackward,
3723+
vimDeleteToCharForward,
3724+
vimDeleteToCharBackward,
36333725
vimInsertAtCursor,
36343726
vimAppendAtCursor,
36353727
vimOpenLineBelow,
@@ -3937,6 +4029,20 @@ export interface TextBuffer {
39374029
* Delete N characters at cursor (vim 'x' command)
39384030
*/
39394031
vimDeleteChar: (count: number) => void;
4032+
/** Delete N characters before cursor (vim 'X') */
4033+
vimDeleteCharBefore: (count: number) => void;
4034+
/** Toggle case of N characters at cursor (vim '~') */
4035+
vimToggleCase: (count: number) => void;
4036+
/** Replace N characters at cursor with char, stay in NORMAL mode (vim 'r') */
4037+
vimReplaceChar: (char: string, count: number) => void;
4038+
/** Move to Nth occurrence of char forward on line; till=true stops before it (vim 'f'/'t') */
4039+
vimFindCharForward: (char: string, count: number, till: boolean) => void;
4040+
/** Move to Nth occurrence of char backward on line; till=true stops after it (vim 'F'/'T') */
4041+
vimFindCharBackward: (char: string, count: number, till: boolean) => void;
4042+
/** Delete from cursor to Nth occurrence of char forward; till=true excludes the char (vim 'df'/'dt') */
4043+
vimDeleteToCharForward: (char: string, count: number, till: boolean) => void;
4044+
/** Delete from Nth occurrence of char backward to cursor; till=true excludes the char (vim 'dF'/'dT') */
4045+
vimDeleteToCharBackward: (char: string, count: number, till: boolean) => void;
39404046
/**
39414047
* Enter insert mode at cursor (vim 'i' command)
39424048
*/

0 commit comments

Comments
 (0)