From 370a31418770f2c6b77937164058e6edfb3fd357 Mon Sep 17 00:00:00 2001 From: longyuqi Date: Tue, 31 Mar 2026 21:08:14 +0800 Subject: [PATCH] fix(shell): prevent Ctrl+W from overwriting system clipboard Replace PyperclipClipboard with the default InMemoryClipboard so that Emacs-style kill commands (Ctrl+W/K/U) only write to the internal kill ring instead of the system clipboard. Ctrl+V text paste now reads the system clipboard directly via pyperclip.paste(), keeping paste functionality intact. Closes #1567 --- src/kimi_cli/ui/shell/prompt.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/kimi_cli/ui/shell/prompt.py b/src/kimi_cli/ui/shell/prompt.py index eea559e21..4f61092a9 100644 --- a/src/kimi_cli/ui/shell/prompt.py +++ b/src/kimi_cli/ui/shell/prompt.py @@ -17,11 +17,11 @@ from pathlib import Path from typing import Any, Literal, Protocol, cast, override +import pyperclip from kaos.path import KaosPath from prompt_toolkit import PromptSession from prompt_toolkit.application.current import get_app_or_none from prompt_toolkit.buffer import Buffer -from prompt_toolkit.clipboard.pyperclip import PyperclipClipboard from prompt_toolkit.completion import ( CompleteEvent, Completer, @@ -1480,15 +1480,16 @@ def _(event: KeyPressEvent) -> None: def _(event: KeyPressEvent) -> None: if self._try_paste_media(event): return - clipboard_data = event.app.clipboard.get_data() - if clipboard_data is None: # type: ignore[reportUnnecessaryComparison] + try: + text = pyperclip.paste() + except Exception: + return + if not text: return - self._insert_pasted_text(event.current_buffer, clipboard_data.text) + self._insert_pasted_text(event.current_buffer, text) event.app.invalidate() - clipboard = PyperclipClipboard() - else: - clipboard = None + clipboard = None self._session = PromptSession[str]( message=self._render_message,