vscode 不支持 code --diff 命令,因其 cli 无 --diff 参数,且 diff 视图依赖编辑器上下文而非无状态命令;可行方案是先打开文件再用快捷键或自动化脚本触发对比,或改用 git diff/diff 命令。

VSCode 没有提供直接通过终端命令行(如 code --diff file1.js file2.js)原生启动内置 Diff 视图的 CLI 参数。这是个常见误解——code 命令行工具支持打开文件、文件夹、设置,但不支持“直接触发 diff editor”。
为什么 code --diff 不存在且不会生效
VSCode 的 CLI 解析器中压根没有 --diff 这个 flag;尝试运行会报错 Unknown argument --diff 或静默忽略。Diff 视图是编辑器内部状态驱动的 UI 组件,依赖已加载的编辑器上下文(比如活动文件、焦点、资源管理器选中状态),无法由纯命令行参数初始化。
- 所有官方文档和
code --help输出里都查不到--diff - 社区曾多次提 issue 要求该功能,但 VSCode 团队明确回复:「diff 是编辑器视图,不属于 CLI 范畴」
- 即使你用
code file1.js file2.js同时打开两个文件,它们只是并排显示在独立标签页,不是 diff editor —— 没有颜色标记、无差异导航、不能 Accept/Revert
真正能从终端间接触发 diff 的方式
绕过 CLI 限制的可行路径只有一条:先让 VSCode 打开一个文件,再用 VSCode 自身的命令协议(vscode:// URL scheme)发送指令激活对比。但这需要两步配合,且仅限本地已运行的 VSCode 实例:
- 确保 VSCode 已启动并处于前台(或后台运行)
- 在终端执行:
code file1.js && sleep 0.5 && open -g "vscode://file/$(pwd)/file2.js?windowId=1"(macOS) - 然后手动按
Ctrl+K Ctrl+D(Win/Linux)或Cmd+K Cmd+D(macOS)触发对比 —— 这步无法跳过
注意:vscode:// 协议不支持直接指定「对比」动作,只能打开文件;windowId 参数不稳定,多窗口时容易发错目标。
更可靠的做法:用 shell 脚本封装命令面板流程
如果你频繁需要终端触发 diff,不如写个轻量脚本,模拟用户操作逻辑:
#!/bin/bash
# save as `vscode-diff`, chmod +x, and put in $PATH
if [ $# -ne 2 ]; then
echo "Usage: vscode-diff <file1><file2>"
exit 1
fi
code "$1"
sleep 0.3
osascript -e "tell application \"Code\" to activate" \
-e "tell application \"System Events\" to keystroke \"p\" using [command down, shift down]" \
-e "delay 0.2" \
-e "tell application \"System Events\" to keystroke \"File: Compare Active File With\" & return" \
-e "delay 0.2" \
-e "tell application \"System Events\" to keystroke \"$2\" & return"
</file2></file1>
这个脚本只适用于 macOS(用了 osascript),Windows 需改用 AutoHotKey,Linux 用 xdotool。核心点在于:它不试图“命令行调用 diff”,而是复现人手操作路径 —— 打开第一个文件 → 唤出命令面板 → 输入指令 → 选择第二个文件。
真正容易被忽略的是:VSCode 的 diff editor 本质是 UI 状态机,不是无状态函数。任何想绕过编辑器上下文直接“生成 diff”的思路都会撞墙。如果真要命令行优先工作流,建议直接用 git diff --no-index file1 file2 或 diff -u file1 file2,再把输出粘贴进 VSCode 查看 —— 它们快、稳、可脚本化,且不受 VSCode 版本迭代影响。











