From 1e715d1e5ce04ccb5f90c4177462603d83169587 Mon Sep 17 00:00:00 2001 From: Tommaso Sciortino Date: Fri, 21 Nov 2025 13:20:37 -0800 Subject: [PATCH] Restore bracketed paste mode after external editor exit (#13606) --- packages/cli/src/gemini.test.tsx | 4 ++++ packages/cli/src/ui/AppContainer.tsx | 2 ++ packages/cli/src/ui/hooks/useBracketedPaste.ts | 12 ++++++------ packages/cli/src/ui/utils/bracketedPaste.ts | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 packages/cli/src/ui/utils/bracketedPaste.ts diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index 5b257ed6f5..ef4efd8965 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -62,6 +62,10 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => { write: vi.fn(), }, })), + enableMouseEvents: vi.fn(), + disableMouseEvents: vi.fn(), + enterAlternateScreen: vi.fn(), + disableLineWrapping: vi.fn(), }; }); diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index 2baf93f4d5..2435976f9d 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -116,6 +116,7 @@ import { isWorkspaceTrusted } from '../config/trustedFolders.js'; import { useAlternateBuffer } from './hooks/useAlternateBuffer.js'; import { useSettings } from './contexts/SettingsContext.js'; import { enableSupportedProtocol } from './utils/kittyProtocolDetector.js'; +import { enableBracketedPaste } from './utils/bracketedPaste.js'; const WARNING_PROMPT_DURATION_MS = 1000; const QUEUE_ERROR_DISPLAY_DURATION_MS = 3000; @@ -387,6 +388,7 @@ export const AppContainer = (props: AppContainerProps) => { disableLineWrapping(); app.rerender(); } + enableBracketedPaste(); enableSupportedProtocol(); refreshStatic(); }, [refreshStatic, isAlternateBuffer, app, config]); diff --git a/packages/cli/src/ui/hooks/useBracketedPaste.ts b/packages/cli/src/ui/hooks/useBracketedPaste.ts index b8a763af42..1e9cbbebcf 100644 --- a/packages/cli/src/ui/hooks/useBracketedPaste.ts +++ b/packages/cli/src/ui/hooks/useBracketedPaste.ts @@ -5,10 +5,10 @@ */ import { useEffect } from 'react'; -import { writeToStdout } from '@google/gemini-cli-core'; - -const ENABLE_BRACKETED_PASTE = '\x1b[?2004h'; -const DISABLE_BRACKETED_PASTE = '\x1b[?2004l'; +import { + disableBracketedPaste, + enableBracketedPaste, +} from '../utils/bracketedPaste.js'; /** * Enables and disables bracketed paste mode in the terminal. @@ -18,11 +18,11 @@ const DISABLE_BRACKETED_PASTE = '\x1b[?2004l'; */ export const useBracketedPaste = () => { const cleanup = () => { - writeToStdout(DISABLE_BRACKETED_PASTE); + disableBracketedPaste(); }; useEffect(() => { - writeToStdout(ENABLE_BRACKETED_PASTE); + enableBracketedPaste(); process.on('exit', cleanup); process.on('SIGINT', cleanup); diff --git a/packages/cli/src/ui/utils/bracketedPaste.ts b/packages/cli/src/ui/utils/bracketedPaste.ts new file mode 100644 index 0000000000..26bb0e08fa --- /dev/null +++ b/packages/cli/src/ui/utils/bracketedPaste.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { writeToStdout } from '@google/gemini-cli-core'; + +const ENABLE_BRACKETED_PASTE = '\x1b[?2004h'; +const DISABLE_BRACKETED_PASTE = '\x1b[?2004l'; + +export const enableBracketedPaste = () => { + writeToStdout(ENABLE_BRACKETED_PASTE); +}; + +export const disableBracketedPaste = () => { + writeToStdout(DISABLE_BRACKETED_PASTE); +};