mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-21 01:07:46 +00:00
Implement additional readline-like keybindings, including alt-left arrow and alt-right arrow. (#443)
This change adds keybinding support for: - `Ctrl+B`: Moves the cursor backward one character. - `Ctrl+F`: Moves the cursor forward one character. - `Alt+Left Arrow`: Moves the cursor backward one word. - `Alt+Right Arrow`: Moves the cursor forward one word. Closes b/411469305.
This commit is contained in:
@@ -44,12 +44,7 @@ export interface MultilineTextEditorProps {
|
||||
|
||||
// Called on all key events to allow the caller. Returns true if the
|
||||
// event was handled and should not be passed to the editor.
|
||||
readonly inputPreprocessor?: (
|
||||
input: string,
|
||||
key: Key,
|
||||
currentText: string,
|
||||
cursorOffset: number,
|
||||
) => boolean;
|
||||
readonly inputPreprocessor?: (input: string, key: Key) => boolean;
|
||||
|
||||
// Optional initial cursor position (character offset)
|
||||
readonly initialCursorOffset?: number;
|
||||
@@ -98,14 +93,7 @@ export const MultilineTextEditor = ({
|
||||
return;
|
||||
}
|
||||
|
||||
// Calculate cursorOffset for inputPreprocessor
|
||||
let charOffset = 0;
|
||||
for (let i = 0; i < buffer.cursor[0]; i++) {
|
||||
charOffset += buffer.lines[i].length + 1; // +1 for newline
|
||||
}
|
||||
charOffset += buffer.cursor[1];
|
||||
|
||||
if (inputPreprocessor?.(input, key, buffer.text, charOffset) === true) {
|
||||
if (inputPreprocessor?.(input, key) === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -121,14 +109,7 @@ export const MultilineTextEditor = ({
|
||||
|
||||
const isCtrlX =
|
||||
(key.ctrl && (input === 'x' || input === '\x18')) || input === '\x18';
|
||||
const isCtrlE =
|
||||
(key.ctrl && (input === 'e' || input === '\x05')) ||
|
||||
input === '\x05' ||
|
||||
(!key.ctrl &&
|
||||
input === 'e' &&
|
||||
input.length === 1 &&
|
||||
input.charCodeAt(0) === 5);
|
||||
if (isCtrlX || isCtrlE) {
|
||||
if (isCtrlX) {
|
||||
buffer.openInExternalEditor();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1104,16 +1104,22 @@ export function useTextBuffer({
|
||||
if (key['return'] || input === '\r' || input === '\n') newline();
|
||||
else if (key['leftArrow'] && !key['meta'] && !key['ctrl'] && !key['alt'])
|
||||
move('left');
|
||||
else if (key['ctrl'] && input === 'b') move('left');
|
||||
else if (key['rightArrow'] && !key['meta'] && !key['ctrl'] && !key['alt'])
|
||||
move('right');
|
||||
else if (key['ctrl'] && input === 'f') move('right');
|
||||
else if (key['upArrow']) move('up');
|
||||
else if (key['downArrow']) move('down');
|
||||
else if ((key['meta'] || key['ctrl'] || key['alt']) && key['leftArrow'])
|
||||
else if ((key['ctrl'] || key['alt']) && key['leftArrow'])
|
||||
move('wordLeft');
|
||||
else if ((key['meta'] || key['ctrl'] || key['alt']) && key['rightArrow'])
|
||||
else if (key['meta'] && input === 'b') move('wordLeft');
|
||||
else if ((key['ctrl'] || key['alt']) && key['rightArrow'])
|
||||
move('wordRight');
|
||||
else if (key['meta'] && input === 'f') move('wordRight');
|
||||
else if (key['home']) move('home');
|
||||
else if (key['ctrl'] && input === 'a') move('home');
|
||||
else if (key['end']) move('end');
|
||||
else if (key['ctrl'] && input === 'e') move('end');
|
||||
else if (
|
||||
(key['meta'] || key['ctrl'] || key['alt']) &&
|
||||
(key['backspace'] || input === '\x7f')
|
||||
|
||||
Reference in New Issue
Block a user