Skip to content

Commit fed8a7d

Browse files
scidominogemini-cli-robot
authored andcommitted
Always enable bracketed paste (#16179)
# Conflicts: # packages/cli/src/ui/contexts/KeypressContext.tsx
1 parent b56a111 commit fed8a7d

File tree

3 files changed

+6
-73
lines changed

3 files changed

+6
-73
lines changed

packages/cli/src/ui/contexts/KeypressContext.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { ESC } from '../utils/input.js';
1919
import { parseMouseEvent } from '../utils/mouse.js';
2020
import { FOCUS_IN, FOCUS_OUT } from '../hooks/useFocus.js';
2121
import { appEvents, AppEvent } from '../../utils/events.js';
22-
import { terminalCapabilityManager } from '../utils/terminalCapabilityManager.js';
2322

2423
export const BACKSLASH_ENTER_TIMEOUT = 5;
2524
export const ESC_TIMEOUT = 50;
@@ -190,6 +189,7 @@ function bufferBackslashEnter(
190189
}
191190

192191
/**
192+
<<<<<<< HEAD
193193
* Converts return keys pressed quickly after other keys into plain
194194
* insertable return characters.
195195
*
@@ -214,6 +214,8 @@ function bufferFastReturn(keypressHandler: KeypressHandler): KeypressHandler {
214214
}
215215

216216
/**
217+
=======
218+
>>>>>>> 88f1ec8d0 (Always enable bracketed paste (#16179))
217219
* Buffers paste events between paste-start and paste-end sequences.
218220
* Will flush the buffer if no data is received for PASTE_TIMEOUT ms or
219221
* when a null key is received.
@@ -661,9 +663,6 @@ export function KeypressProvider({
661663
process.stdin.setEncoding('utf8'); // Make data events emit strings
662664

663665
let processor = nonKeyboardEventFilter(broadcast);
664-
if (!terminalCapabilityManager.isBracketedPasteEnabled()) {
665-
processor = bufferFastReturn(processor);
666-
}
667666
processor = bufferBackslashEnter(processor);
668667
processor = bufferPaste(processor);
669668
let dataListener = createDataListener(processor);

packages/cli/src/ui/utils/terminalCapabilityManager.test.ts

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -266,46 +266,4 @@ describe('TerminalCapabilityManager', () => {
266266
expect(manager.isModifyOtherKeysEnabled()).toBe(true);
267267
});
268268
});
269-
270-
describe('bracketed paste detection', () => {
271-
it('should detect bracketed paste support (mode set)', async () => {
272-
const manager = TerminalCapabilityManager.getInstance();
273-
const promise = manager.detectCapabilities();
274-
275-
// Simulate bracketed paste response: \x1b[?2004;1$y
276-
stdin.emit('data', Buffer.from('\x1b[?2004;1$y'));
277-
// Complete detection with DA1
278-
stdin.emit('data', Buffer.from('\x1b[?62c'));
279-
280-
await promise;
281-
expect(manager.isBracketedPasteSupported()).toBe(true);
282-
expect(manager.isBracketedPasteEnabled()).toBe(true);
283-
});
284-
285-
it('should detect bracketed paste support (mode reset)', async () => {
286-
const manager = TerminalCapabilityManager.getInstance();
287-
const promise = manager.detectCapabilities();
288-
289-
// Simulate bracketed paste response: \x1b[?2004;2$y
290-
stdin.emit('data', Buffer.from('\x1b[?2004;2$y'));
291-
// Complete detection with DA1
292-
stdin.emit('data', Buffer.from('\x1b[?62c'));
293-
294-
await promise;
295-
expect(manager.isBracketedPasteSupported()).toBe(true);
296-
expect(manager.isBracketedPasteEnabled()).toBe(true);
297-
});
298-
299-
it('should not enable bracketed paste if not supported', async () => {
300-
const manager = TerminalCapabilityManager.getInstance();
301-
const promise = manager.detectCapabilities();
302-
303-
// Complete detection with DA1 only
304-
stdin.emit('data', Buffer.from('\x1b[?62c'));
305-
306-
await promise;
307-
expect(manager.isBracketedPasteSupported()).toBe(false);
308-
expect(manager.isBracketedPasteEnabled()).toBe(false);
309-
});
310-
});
311269
});

packages/cli/src/ui/utils/terminalCapabilityManager.ts

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ export class TerminalCapabilityManager {
2525
private static readonly TERMINAL_NAME_QUERY = '\x1b[>q';
2626
private static readonly DEVICE_ATTRIBUTES_QUERY = '\x1b[c';
2727
private static readonly MODIFY_OTHER_KEYS_QUERY = '\x1b[>4;?m';
28-
private static readonly BRACKETED_PASTE_QUERY = '\x1b[?2004$p';
2928

3029
// Kitty keyboard flags: CSI ? flags u
3130
// eslint-disable-next-line no-control-regex
@@ -43,10 +42,6 @@ export class TerminalCapabilityManager {
4342
// modifyOtherKeys response: CSI > 4 ; level m
4443
// eslint-disable-next-line no-control-regex
4544
private static readonly MODIFY_OTHER_KEYS_REGEX = /\x1b\[>4;(\d+)m/;
46-
// DECRQM response for bracketed paste: CSI ? 2004 ; Ps $ y
47-
// Ps = 1 (set), 2 (reset), 3 (permanently set), 4 (permanently reset)
48-
// eslint-disable-next-line no-control-regex
49-
private static readonly BRACKETED_PASTE_REGEX = /\x1b\[\?2004;([1-4])\$y/;
5045

5146
private terminalBackgroundColor: TerminalBackgroundColor;
5247
private kittySupported = false;
@@ -55,7 +50,6 @@ export class TerminalCapabilityManager {
5550
private terminalName: string | undefined;
5651
private modifyOtherKeysSupported = false;
5752
private modifyOtherKeysEnabled = false;
58-
private bracketedPasteSupported = false;
5953
private bracketedPasteEnabled = false;
6054

6155
private constructor() {}
@@ -107,7 +101,6 @@ export class TerminalCapabilityManager {
107101
let deviceAttributesReceived = false;
108102
let bgReceived = false;
109103
let modifyOtherKeysReceived = false;
110-
let bracketedPasteReceived = false;
111104
// eslint-disable-next-line prefer-const
112105
let timeoutId: NodeJS.Timeout;
113106

@@ -172,17 +165,6 @@ export class TerminalCapabilityManager {
172165
}
173166
}
174167

175-
// check for bracketed paste support
176-
if (!bracketedPasteReceived) {
177-
const match = buffer.match(
178-
TerminalCapabilityManager.BRACKETED_PASTE_REGEX,
179-
);
180-
if (match) {
181-
bracketedPasteReceived = true;
182-
this.bracketedPasteSupported = true;
183-
}
184-
}
185-
186168
// Check for Terminal Name/Version response.
187169
if (!terminalNameReceived) {
188170
const match = buffer.match(
@@ -219,7 +201,6 @@ export class TerminalCapabilityManager {
219201
TerminalCapabilityManager.OSC_11_QUERY +
220202
TerminalCapabilityManager.TERMINAL_NAME_QUERY +
221203
TerminalCapabilityManager.MODIFY_OTHER_KEYS_QUERY +
222-
TerminalCapabilityManager.BRACKETED_PASTE_QUERY +
223204
TerminalCapabilityManager.DEVICE_ATTRIBUTES_QUERY,
224205
);
225206
} catch (e) {
@@ -238,10 +219,9 @@ export class TerminalCapabilityManager {
238219
enableModifyOtherKeys();
239220
this.modifyOtherKeysEnabled = true;
240221
}
241-
if (this.bracketedPasteSupported) {
242-
enableBracketedPasteMode();
243-
this.bracketedPasteEnabled = true;
244-
}
222+
// Always enable bracketed paste since it'll be ignored if unsupported.
223+
enableBracketedPasteMode();
224+
this.bracketedPasteEnabled = true;
245225
} catch (e) {
246226
debugLogger.warn('Failed to enable keyboard protocols:', e);
247227
}
@@ -259,10 +239,6 @@ export class TerminalCapabilityManager {
259239
return this.kittyEnabled;
260240
}
261241

262-
isBracketedPasteSupported(): boolean {
263-
return this.bracketedPasteSupported;
264-
}
265-
266242
isBracketedPasteEnabled(): boolean {
267243
return this.bracketedPasteEnabled;
268244
}

0 commit comments

Comments
 (0)