mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-12 12:54:07 -07:00
fix: handle Shift+Space in Kitty keyboard protocol terminals (#15767)
This commit is contained in:
@@ -224,40 +224,60 @@ describe('KeypressContext', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Tab and Backspace handling', () => {
|
describe('Tab, Backspace, and Space handling', () => {
|
||||||
it.each([
|
it.each([
|
||||||
{
|
{
|
||||||
name: 'Tab key',
|
name: 'Tab key',
|
||||||
sequence: '\x1b[9u',
|
inputSequence: '\x1b[9u',
|
||||||
expected: { name: 'tab', shift: false },
|
expected: { name: 'tab', shift: false },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Shift+Tab',
|
name: 'Shift+Tab',
|
||||||
sequence: '\x1b[9;2u',
|
inputSequence: '\x1b[9;2u',
|
||||||
expected: { name: 'tab', shift: true },
|
expected: { name: 'tab', shift: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Backspace',
|
name: 'Backspace',
|
||||||
sequence: '\x1b[127u',
|
inputSequence: '\x1b[127u',
|
||||||
expected: { name: 'backspace', meta: false },
|
expected: { name: 'backspace', meta: false },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Option+Backspace',
|
name: 'Option+Backspace',
|
||||||
sequence: '\x1b[127;3u',
|
inputSequence: '\x1b[127;3u',
|
||||||
expected: { name: 'backspace', meta: true },
|
expected: { name: 'backspace', meta: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Ctrl+Backspace',
|
name: 'Ctrl+Backspace',
|
||||||
sequence: '\x1b[127;5u',
|
inputSequence: '\x1b[127;5u',
|
||||||
expected: { name: 'backspace', ctrl: true },
|
expected: { name: 'backspace', ctrl: true },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Shift+Space',
|
||||||
|
inputSequence: '\x1b[32;2u',
|
||||||
|
expected: {
|
||||||
|
name: 'space',
|
||||||
|
shift: true,
|
||||||
|
insertable: true,
|
||||||
|
sequence: ' ',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Ctrl+Space',
|
||||||
|
inputSequence: '\x1b[32;5u',
|
||||||
|
expected: {
|
||||||
|
name: 'space',
|
||||||
|
ctrl: true,
|
||||||
|
insertable: false,
|
||||||
|
sequence: '\x1b[32;5u',
|
||||||
|
},
|
||||||
|
},
|
||||||
])(
|
])(
|
||||||
'should recognize $name in kitty protocol',
|
'should recognize $name in kitty protocol',
|
||||||
async ({ sequence, expected }) => {
|
async ({ inputSequence, expected }) => {
|
||||||
const { keyHandler } = setupKeypressTest();
|
const { keyHandler } = setupKeypressTest();
|
||||||
|
|
||||||
act(() => {
|
act(() => {
|
||||||
stdin.write(sequence);
|
stdin.write(inputSequence);
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(keyHandler).toHaveBeenCalledWith(
|
expect(keyHandler).toHaveBeenCalledWith(
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ const KEY_INFO_MAP: Record<
|
|||||||
'[9u': { name: 'tab' },
|
'[9u': { name: 'tab' },
|
||||||
'[13u': { name: 'return' },
|
'[13u': { name: 'return' },
|
||||||
'[27u': { name: 'escape' },
|
'[27u': { name: 'escape' },
|
||||||
|
'[32u': { name: 'space' },
|
||||||
'[127u': { name: 'backspace' },
|
'[127u': { name: 'backspace' },
|
||||||
'[57414u': { name: 'return' }, // Numpad Enter
|
'[57414u': { name: 'return' }, // Numpad Enter
|
||||||
'[a': { name: 'up', shift: true },
|
'[a': { name: 'up', shift: true },
|
||||||
@@ -479,6 +480,10 @@ function* emitKeys(
|
|||||||
if (keyInfo.ctrl) {
|
if (keyInfo.ctrl) {
|
||||||
ctrl = true;
|
ctrl = true;
|
||||||
}
|
}
|
||||||
|
if (name === 'space' && !ctrl && !meta) {
|
||||||
|
sequence = ' ';
|
||||||
|
insertable = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
name = 'undefined';
|
name = 'undefined';
|
||||||
if ((ctrl || meta) && (code.endsWith('u') || code.endsWith('~'))) {
|
if ((ctrl || meta) && (code.endsWith('u') || code.endsWith('~'))) {
|
||||||
|
|||||||
Reference in New Issue
Block a user