VSCode终端中Codex CLI按Ctrl+V无法粘贴图片(被VSCode截获)(keybindings.json、workbench.action.terminal.sendSequence)

📅 2026/8/26 15:20:12
VSCode终端中Codex CLI按Ctrl+V无法粘贴图片(被VSCode截获)(keybindings.json、workbench.action.terminal.sendSequence)
参考文章WSL2 Codex图片粘贴问题无法粘贴Codex粘贴图片WSLg、Wayland剪贴板、X11剪贴板、xclip、ImageMagick、wl-paste、wl-clipboard、XFixes文章目录VS Code 终端中的 Codex CLI 按 CtrlV 无法粘贴图片不是剪贴板坏了而是快捷键被拦截摘要一、问题现象二、先确认图片数据链路是否正常1. 检查 Wayland 剪贴板2. 检查 X11 剪贴板3. 检查后台服务三、真正原因VS Code 把 CtrlV 截走了四、解决方法使用 sendSequence 发送原始 CtrlV第一步打开键盘快捷键 JSON第二步确认打开的是 keybindings.json第三步覆盖终端中的 CtrlV 行为五、验证修复结果六、一个重要取舍普通文本怎么粘贴七、为什么不直接启用 sendKeybindingsToShell八、快速故障定位表九、备用方案直接使用图片文件十、总结第一层图片数据链路第二层键盘事件链路参考资料VS Code 终端中的 Codex CLI 按 CtrlV 无法粘贴图片不是剪贴板坏了而是快捷键被拦截实测环境Windows 11 WSL2/WSLg Ubuntu 26.04 VS Code Remote WSL Codex CLI 0.149.0问题表现独立终端中的 Codex 已经可以粘贴图片但 VS Code 集成终端中按CtrlV没有任何反应最终原因Windows 版 VS Code 把CtrlV当成“向终端粘贴内容”没有把原始CtrlV控制字符交给 Codex摘要此前我已经解决了 Windows 与 WSLgWSL Ubuntu 之间的图片剪贴板格式问题后台桥接服务会把 Wayland 中的image/bmp转换为 X11CLIPBOARD中的image/png。在独立的 Git Bash 终端里运行 Codex CLI 后按CtrlV已经能够附加图片。奇怪的是把同样的 Codex CLI 放到 VS Code 的 WSL 集成终端里运行CtrlV又失效了既没有出现[Image #1]也没有任何报错输入框看起来完全没有变化。最终确认这不是桥接服务失效也不是虚拟环境、WSL 配置或 Codex 图片能力的问题而是另一个独立层次的问题Windows 图片剪贴板 │ ▼ WSLg Wayland image/bmp │ 后台桥接服务 ▼ X11 CLIPBOARD image/png ← 图片数据已经准备好 │ ▼ Codex CLI 等待原始 CtrlV 按键 ← VS Code 在这里截走了按键解决办法是在 VS Code 的keybindings.json中通过workbench.action.terminal.sendSequence把CtrlV对应的控制字符\u0016直接发送给终端前台程序。一、问题现象Codex CLI 的交互式输入框支持直接粘贴图片。OpenAI 官方文档也说明可以把图片粘贴到交互式 composer或者使用codex --image将图片文件附加到首条提示中。在独立终端中复制 Windows 截图后按CtrlVCodex 可以显示[Image #1]但在 VS Code 的 WSL 集成终端中执行相同步骤结果却是输入框没有出现图片附件没有Failed to paste image错误没有任何可见字符连续按CtrlV依旧像什么都没有发生。“完全没有反应”其实是一个非常关键的线索。如果 Codex 收到了CtrlV只是读取不到图片它通常会明确提示Failed to paste image: no image on clipboard现在连这个错误都没有说明失败很可能发生在 Codex 之前按键根本没有到达 Codex。二、先确认图片数据链路是否正常不要一看到CtrlV无效就立刻修改剪贴板服务。应该先把“图片数据”和“键盘事件”分开验证。1. 检查 Wayland 剪贴板wl-paste --list-types在排查过程中这条命令有时只显示text/html text/plain;charsetutf-8 STRING也可能完全没有输出。这只能说明当时 Wayland clipboard 的 owner 和格式状态不能单独证明最终供 Codex 使用的 X11 剪贴板没有图片。我们的桥接器最终发布到的是 X11CLIPBOARD因此还必须检查 X11。2. 检查 X11 剪贴板xclip-selectionclipboard-tTARGETS-o实测输出包含TARGETS image/png这说明 Codex 所需的 PNG 已经存在于 X11 剪贴板中。3. 检查后台服务systemctl--userstatus codex-clipboard-bridge.service journalctl--user-ucodex-clipboard-bridge.service-n30--no-pager实测服务状态为ActiveStateactive SubStaterunning日志中还能看到刚复制的截图已经转换成功codex-clipboard-bridge: bridged 2520x1620 image (...) to X11 as PNG至此图片链路已经形成完整证据闭环桥接服务正在运行 日志记录转换成功 X11 TARGETS 包含 image/png 图片数据已经准备好因此VS Code 中的问题不是“没有图片”而是“没有触发 Codex 读取图片”。三、真正原因VS Code 把 CtrlV 截走了在 Windows 版 VS Code 的集成终端里CtrlV默认是一个 VS Code 终端快捷键其含义是Paste into active terminal也就是说VS Code 会读取系统剪贴板并尝试把其中的文本作为粘贴内容写入终端。这个过程与“把原始CtrlV按键发送给终端前台程序”并不是同一件事。当剪贴板里是一张图片而不是文本时VS Code 没有可写入终端的文本于是表面上什么也不会发生与此同时Codex 也没有收到它监听的CtrlV控制字符。这解释了为什么Git Bash 独立窗口中可以成功VS Code 集成终端中没有反应同一个 WSL、同一个 Codex、同一个剪贴板服务表现却不同。差异并不在 WSL而在终端宿主如何处理快捷键。四、解决方法使用 sendSequence 发送原始 CtrlV第一步打开键盘快捷键 JSON在 VS Code 中按CtrlShiftP搜索Preferences: Open Keyboard Shortcuts (JSON)选择用户快捷键配置而不是Open Default Keyboard Shortcuts (JSON)。第二步确认打开的是 keybindings.json新文件通常只有一个空数组[]Windows 上对应的用户配置路径通常是C:\Users\用户名\AppData\Roaming\Code\User\keybindings.json注意这里修改的是keybindings.json不是项目里的.vscode/settings.json也不是 WSL 里的 shell 配置文件。第三步覆盖终端中的 CtrlV 行为写入[{key:ctrlv,command:workbench.action.terminal.sendSequence,args:{text:\u0016},when:terminalFocus}]配置项的含义如下配置作用key: ctrlv捕获 VS Code 中的CtrlVworkbench.action.terminal.sendSequence向活动终端发送指定字符序列text: \u0016发送 ASCII 十进制 22也就是控制字符CtrlVwhen: terminalFocus只在集成终端拥有焦点时生效不影响代码编辑器保存文件后快捷键通常会立即生效不需要重启 WSL也不需要重新安装 Codex 或剪贴板服务。五、验证修复结果按照下面的顺序测试在 Windows 中复制或截取一张图片确认桥接器已生成 X11 PNGxclip-selectionclipboard-tTARGETS-o确认输出包含image/png在 VS Code 集成终端中启动 Codexcodex聚焦 Codex 输入框按CtrlV。修复成功后输入框会显示[Image #1]这时可以继续输入对图片的说明再按 Enter 一起发送。六、一个重要取舍普通文本怎么粘贴上面的配置把集成终端中的CtrlV交给了终端前台程序。这非常适合 Codex但也意味着 VS Code 原来的“粘贴文本到终端”快捷键被覆盖。此时普通文本可以通过以下方式粘贴在终端中单击鼠标右键使用终端菜单中的 Paste或者给 Codex 图片粘贴设置一个单独的快捷键。如果希望保留原来的CtrlV文本粘贴推荐改用CtrlAltV触发 Codex 图片读取[{key:ctrlaltv,command:workbench.action.terminal.sendSequence,args:{text:\u0016},when:terminalFocus}]这样CtrlV → 普通终端文本粘贴 CtrlAltV → 把原始 CtrlV 发送给 Codex读取图片对于经常同时粘贴命令和截图的用户这个方案更不容易混淆。七、为什么不直接启用 sendKeybindingsToShellVS Code 还提供terminal.integrated.sendKeybindingsToShell:true但它会把大量快捷键都交给 shell可能连CtrlF等 VS Code 终端快捷键也一起改变。为了解决一个明确的CtrlV冲突没有必要扩大影响范围。sendSequence只处理我们指定的按键作用范围更小也更容易理解和撤销。八、快速故障定位表现象更可能的问题检查方向Codex 显示no image on clipboard按键已送达但图片格式或剪贴板 owner 不正确检查 Wayland/X11 图片类型VS Code 中按CtrlV完全无反应VS Code 拦截了快捷键配置terminal.sendSequence独立终端成功VS Code 失败终端宿主按键处理不同检查 VS Codekeybindings.jsonxclip ... TARGETS没有image/png图片桥接尚未成功检查服务状态和日志xclip ... TARGETS已有image/pngCodex 仍无反应图片已就绪但 Codex 没收到按键发送\u0016这里最重要的排查原则是不要把“剪贴板里有没有图片”和“CtrlV 有没有送到 Codex”混成一个问题。它们属于两条不同链路必须分别验证。九、备用方案直接使用图片文件如果暂时不想修改快捷键也可以绕过剪贴板通过文件路径启动 Codexcodex--image/path/to/screenshot.png请分析这张截图这能验证 Codex 本身是否具备图片输入能力但它不能代替交互式会话中随手按CtrlV的体验。十、总结这次问题之所以容易误判是因为它发生在连续的两层兼容链路上第一层图片数据链路Windows screenshot → WSLg Wayland image/bmp → clipboard bridge → X11 image/png这一层由 Codex WSL Clipboard Bridge 解决。第二层键盘事件链路CtrlV → VS Code 默认执行 terminal paste → Codex 收不到 CtrlV这一层通过下面的配置解决{key:ctrlv,command:workbench.action.terminal.sendSequence,args:{text:\u0016},when:terminalFocus}最终桥接服务负责把图片准备成 Codex 能读取的格式VS Code 快捷键则负责真正触发 Codex 去读取它。两者缺一不可。参考资料OpenAI Codex CLI 官方文档OpenAI Codex 命令参考--imageVS Code 官方文档终端复制与粘贴VS Code 官方文档Custom sequence keyboard shortcutsCodex WSL Clipboard Bridge 项目主页