vs code终端中ctrl+c用于中断命令而非复制,正确复制需先选中文本再按ctrl+shift+c(windows/linux)或cmd+shift+c(macos),粘贴必须用ctrl+shift+v或cmd+shift+v,且焦点须在终端内。

终端里 Ctrl+C 不是复制,是中断命令
VS Code 的集成终端(Terminal)默认把 Ctrl+C 当作发送 SIGINT 信号用,用来终止正在运行的进程。哪怕你只是想复制一段日志,按 Ctrl+C 也会直接杀掉 npm run dev 或 python app.py,而不是复制文本。
真正用于复制的快捷键是:Ctrl+Shift+C(Windows/Linux)或 Cmd+Shift+C(macOS)。但这个操作有个前提:你得先选中内容——用鼠标拖选,或者用 Shift+↑/↓、Shift+Home/End 手动选中多行。
- 没选中时按
Ctrl+Shift+C,什么都不会发生 - 选中后按
Ctrl+Shift+C,复制的是纯文本,不含颜色、ANSI 转义序列(比如\u001b[32m),适合粘贴到笔记或 Slack - 如果需要带颜色的日志(比如调试时要看红绿高亮),得靠终端模拟器本身支持(如 Windows Terminal 的“复制为 HTML”功能),VS Code 终端原生不提供
粘贴进终端必须用 Ctrl+Shift+V,不能用 Ctrl+V
在终端里按 Ctrl+V 是无效的——它不会触发粘贴,甚至可能被某些 shell(如 zsh)解释为字面字符输入(比如插入 ^V),导致命令出错。
唯一可靠的粘贴方式是 Ctrl+Shift+V(Windows/Linux)或 Cmd+Shift+V(macOS)。这个快捷键绕过 shell 的输入处理,直接把剪贴板内容写入终端输入缓冲区。
- 粘贴长命令(比如带换行的
curl脚本)时,Ctrl+Shift+V会自动保留换行,逐行执行(前提是 shell 支持多行编辑,bash/zsh 默认支持) - 如果粘贴后命令立刻执行失败,检查是否含不可见 Unicode 字符(比如从网页复制的全角空格或零宽字符),可用
cat -v查看 - 远程开发(SSH/WSL)下,该快捷键依赖终端模拟器的剪贴板集成;若失效,先确认 Windows Terminal 或 iTerm2 是否开启了“Enable clipboard integration”
为什么终端和编辑器剪贴板有时不同步
VS Code 编辑器区域和终端区域使用的是同一个系统剪贴板,但它们的焦点和权限模型隔离。常见断点有三个:
-
WSL2默认不与 Windows 剪贴板同步:需在 WSL 中运行sudo /mnt/c/Windows/System32/clip.exe或启用wsl.conf中的clipboard=true - SSH 连接完全不共享剪贴板:你复制的文本只存在本地 VS Code,远程终端收不到;除非用支持 X11 转发的终端(如 MobaXterm)或配置
tmux+reattach-to-user-namespace - 某些安全策略禁用终端访问剪贴板:比如企业版 VS Code 启用了
terminal.integrated.allowChainedPrompts或沙箱模式,此时Ctrl+Shift+C/V会被静默忽略
想改终端快捷键?别碰 keybindings.json 里的 editor 命令
终端的复制粘贴行为由终端模拟器底层控制,不是 VS Code 的 editor.action.clipboardCopyAction 这类编辑器命令。你在 keybindings.json 里绑定任何 editor.* 命令,对终端都无效。
能调的只有两个地方:
- 设置
terminal.integrated.copyOnSelection为true:选中文本后自动复制,省去按Ctrl+Shift+C的步骤(但会覆盖你之前复制的其他内容) - 修改
terminal.integrated.commandsToSkipShell,把workbench.action.terminal.copySelection和workbench.action.terminal.paste加进去——这能让快捷键优先走 VS Code 的终端命令,而非被 shell 拦截 - 注意:
Ctrl+Shift+C/V是硬编码在终端模拟器里的,无法重映射为Ctrl+C/V;强行覆盖会导致终端失去中断能力或粘贴乱码
最常被忽略的一点:终端快捷键生效的前提是焦点真正在终端面板内。如果你刚从搜索框(Ctrl+P)切回来,或弹出了调试变量窗,按 Ctrl+Shift+C 会没反应——先点一下终端窗口再试。











