我承认,一开始看到「终端中的 vscode」这个说法,我脑子里闪过的还是那种全屏终端里的文本编辑器,类似老一代开发者在服务器上用的 vim 那样。真正试过之后才知道,这里讲的是另一件事:你在终端里敲一行 code,VSCode 就会按你给的参数打开目录、打开文件、对比差异、跳到指定行,甚至还能处理远程服务器上的代码。对每天泡在命令行的人来说,这个命令解决的是最日常的痛点:从键盘切到鼠标、在文件管理器里翻目录、再拖进编辑器图标,那几秒钟的割裂感积少成多,真的很打断思路。
这篇文章不是讲怎么在终端里装一个文本编辑器,而是讲怎么把已经熟悉的 VSCode,变成终端里的「打开动作」。适合这几类人:每天要在多个项目之间反复切换的开发者,经常 SSH 上服务器改代码的人,以及刚换了新电脑想快速还原开发环境的人。下面从安装开始,把 code 命令的几个隐藏技能逐个挖一遍。
1. 先搞清楚 code 命令到底是什么:终端与 VSCode 之间的这座桥
1.1 为什么愿意为这一行命令改变习惯
我刚开始也觉得,code . 不就是代替一次「右键用 VSCode 打开」吗?实际用久了才发现,它带来的是一整套行为方式的改变:终端是入口,编辑器是被调起来的工具,而不是反过来。以前我在项目之间切换,至少要点开访达或资源管理器,找到目录,双击进入,再拖动窗口;现在就是 cd projA && code .,一会儿又切到 projB,code . 再来一次。多窗口、多项目、多远程机器,全部从同一台终端管理,不用再回忆「我的项目到底放在哪个盘哪个文件夹下面」。
理解 code 命令的本质也很重要。它并不是每次重新启动一个 VSCode 实例,更像一个传话的中间人:找到已经运行中的编辑器进程,把你想打开的路径递过去,然后自己立刻退出。也就是说,在绝大多数场景下,终端里敲 code 只是发一条 IPC 消息,根本不会等你启动整个应用,所以体感上几乎是无缝的。这也是为什么它比「重新双击图标再等窗口加载」要顺手得多。
1.2 三种系统下把 code 装进终端
这个步骤看起来简单,但我确实见过不少人在第一步就卡住。
macOS 上最简单。打开 VSCode,按下 Cmd + Shift + P 呼出命令面板,输入 Shell Command: Install 'code' command in PATH 回车,它会自动在用户目录下生成一个带 code 的链接。装完以后 which code 应该能看到路径。
Windows 上,多数人是在安装 VSCode 时勾选了「添加到 PATH」这个选项,所以装完就能用。如果当初没勾,也没关系,打开命令面板,搜索并执行「安装 code 命令」同样可以完成。实在不行,手动把 VSCode 安装目录下的 bin 目录加到环境变量里,效果一样。
Linux 下,用官方 deb/rpm 包装完,/usr/bin/code 一般就有了。需要注意的是 Snap 或 Flatpak 这类发行渠道装的版本,code 可能不在常规 PATH 里,装完先 which code 看一眼比较稳妥。另外,改完 PATH 之后务必重新打开一次终端,很多「为什么我的 code 还是 command not found」的报错,都是因为终端还留着改之前的 PATH 缓存。
1.3 装完的第一件事:验证与打开当前目录
装好之后,先跑两步确认:
bash复制which code
code --version
如果这里报 command not found,按上面说的方法检查 PATH。确认没问题,随便进一个项目目录:
bash复制cd ~/projects/your-project
code .
第一次用的时候,你会感觉到它和传统的打开方式没有本质区别,但次数一多,那种「不用挪开手」的爽感就出来了。接下来要讲的,才是它真正值钱的参数部分。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 被大多数人忽略的参数组合:code 命令的完整使用手册
2.1 打开目录和文件:基础中的基础
code . 打开当前目录,这个大家都知道。但它其实也支持直接打开文件,甚至一次性传多个路径:
bash复制code src/main.ts
code src/main.ts src/utils.ts README.md
有一个细节值得单独说出来:文件不存在也可以传。比如你临时想到某个模块还没创建,直接 code src/services/payment.ts,VSCode 里会出现一个还没保存的编辑器页签,路径已经帮你带上了,按下 Cmd+S / Ctrl+S 保存时,对应目录和文件才会真正创建出来。这个行为在写新代码时非常顺手,相当于用一个命令完成了「定位路径 + 新建文件 + 打开编辑器」三个动作。
另一个高频用法是快速改配置文件:code ~/.zshrc、code ~/.ssh/config。不用先定位到家目录再慢慢展开隐藏目录,直接写路径就行。
2.2 差异对比与行号跳转:两个高频参数
先说文件对比。code --diff 可以把两个文件放到同一个差异视图里,和平时用 VSCode 看 Git 改动一样的界面:
bash复制code --diff local.conf prod.conf
这个参数我最常用在「本地配置和服务端配置对比」「两份日志格式对比」「代码分支之间某个文件想细看」这几类场景。它比再开一个文件手动上下扫方便得多——红绿差异会直接标出来。
再说跳转。code --goto 可以打开文件后精确跳到某一行,也可以附上列号:
bash复制code --goto src/main.ts:42
code --goto src/main.ts:42:8
配合编译器或者测试工具的输出就是神器。比如某个测试报告里说 tests/test_login.py:45 出错,你不需要手动数行号:
bash复制code --goto tests/test_login.py:45
我后来在脚本里经常把报错信息里的 file:line 提取出来,直接拼成这条命令传给 VSCode,整个过程手不需要离开键盘。
2.3 窗口复用与控制:--new-window、--reuse-window、--wait
code 命令对窗口的控制比很多人想象的细致。
--new-window(简写-n):强制新开一个窗口,适合同时并行两个项目。--reuse-window(简写-r):强制在最近活动的窗口里打开,避免窗口越堆越多。--wait(简写-w):让终端等 VSCode 里的编辑动作完成后再继续。
前两个只需要知道自己想要哪种行为,不指定时 VSCode 会根据当前实例情况自行决定,所以当你觉得窗口总是乱开时,直接加 -r 就行。
--wait 才是这里面最值得花时间理解的一个。它让那个「传话的中间人」不要立刻退出,而是等到相关窗口关闭之后再返回终端。这样 code 就能充当一个正经的外部编辑器。
最有代表性的用法是把它交给 Git 去编辑提交信息:
bash复制git config --global core.editor "code --wait"
Git 会把「编辑器进程结束」当作「编辑完成」,所以这里如果不写 --wait,Git 会以为你什么都没干就完成了编辑,提交要么失败要么直接用了默认信息。配好之后,执行 git commit,弹出的就是 VSCode 窗口,写完提交信息保存并关闭,Git 自动继续执行。这对已经习惯 VSCode 快捷键的人来说,比在终端里用 nano 或 vim 写提交信息舒服太多。
2.4 少有人看但能救急的杂项参数
code --help 会列出全部参数,我是建议你花两分钟看一遍的。几个我用过且觉得值得知道的:
code --status:打印运行状态和诊断信息,包括当前打开的工作区、扩展加载数量、GPU 状态等,遇到编辑器诡异卡顿会给出不少线索。code --verbose:以详细日志模式启动,排查启动阶段的问题用。code --disable-extension <id>:禁用某个扩展启动,后面讲扩展排查会用到。code --disable-extensions:禁用所有扩展启动,相当于一个「安全模式」,判断问题是不是扩展引起时非常有效。code --locale zh-cn:临时用指定语言启动界面,适合偶尔想看一眼其他语言的菜单。
这些参数平时不一定天天用,但知道存在,真到需要的时候就省一大圈事。
3. 用命令行管理扩展:换机器时五分钟复刻开发环境
3.1 扩展的增删查全部支持命令行
VSCode 的扩展管理也完全可以在终端里进行。三个最基本的操作:
bash复制code --install-extension <publisher.name>
code --uninstall-extension <publisher.name>
code --list-extensions
扩展 ID 的格式是「发布者.扩展名」。如果你不想记,打开扩展面板点开任意一个扩展,页面右侧标题附近就是它的 ID。除了在线安装,本地也支持:
bash复制code --install-extension /path/to/your-extension.vsix
离线环境或者公司内部私有扩展仓库分发时,用 .vsix 安装特别方便。
3.2 导出和批量安装:你的环境可以复制
扩展面板右上角的「导出扩展」也能做清单,但命令行方式更适合放进脚本和 dotfiles。
导出当前全部扩展:
bash复制code --list-extensions > ~/dotfiles/vscode-extensions.txt
换了一台新机器,或者重装完系统,一条命令批量装回来:
bash复制cat ~/dotfiles/vscode-extensions.txt | xargs -n 1 code --install-extension
如果希望清单里同时保留版本号,方便之后精确还原:
bash复制code --list-extensions --show-versions > ~/dotfiles/vscode-extensions-with-version.txt
Windows 的 PowerShell 用户对应写法也不复杂:
powershell复制code --list-extensions | Set-Content extensions.txt
Get-Content extensions.txt | ForEach-Object { code --install-extension $_ }
这条批量安装的能力,配合后面的设置同步,基本可以让新机器的开发环境「分钟级」复活,省去一个个翻扩展市场点安装的惨痛过程。
3.3 用命令行排查扩展问题
扩展装多了总有翻车的一天。某天我发现 VSCode 启动后菜单响应慢,还时不时报某个窗口卡顿。先看扩展列表:
bash复制code --list-extensions
然后把最近装的那几个扩展挨个禁用,每禁用一个就重启一次试试。更高效的办法是直接开「安全模式」:
bash复制code --disable-extensions
如果进入安全模式后一切正常,那基本可以确定是扩展之间的冲突,或者某个扩展在拖后腿。接下来再二分排查:启用一半扩展,重启;再缩小范围,很快就能定位。另外,code --status 也会在输出里打印扩展的加载情况和崩溃信息,很多时候它比你自己猜要直观得多。
3.4 设置和快捷键也可以放进 dotfiles
既然扩展清单都开始用命令行维护了,那配置同步也没必要完全依赖账户登录。直接把用户设置文件纳入 dotfiles 仓库管理也是一个常见做法:
- macOS 路径:
~/Library/Application Support/Code/User/ - Windows 路径:
%APPDATA%\Code\User\ - Linux 路径:
~/.config/Code/User/
这几个目录下的 settings.json 和 keybindings.json,分别是设置和快捷键配置文件。我自己是维护一个公共版本,放到 dotfiles 里,新环境先装扩展再软链配置文件,几分钟就能恢复到一个基本可用的编辑器状态。
4. 远程开发才是大招:SSH 服务器上的终端直接打开本地编辑器
4.1 从远程终端敲 code .,打开的却是本地窗口
如果你只把 code 命令用在本地目录,其实还远远没摸到它的上限。远程开发场景下,它带来的体验变化是颠覆性的。
前提是你本地 VSCode 装了 Remote-SSH 扩展,并且通过它连接过目标服务器。连接过一次之后,服务器端会安装对应的 VSCode Server 组件,远程终端里也就有了 code 命令。
接下来神奇的事情出现了:你在远程终端里执行:
bash复制cd /srv/www/app
code .
屏幕上不会尝试去启动一个服务器端 GUI(服务器本来就没有),而是你本地的 VSCode 窗口直接打开了,左侧文件树里显示的就是服务器上 /srv/www/app 的内容,集成终端也自动落在了远程路径。等于你保住了本地编辑器的全部习惯,但代码、依赖、运行环境全都在远端。
这个玩法对「本地是轻薄本,代码在实验室或公司服务器」的场景非常实用。终端里管包、跑脚本、查日志,写代码时在本地 VSCode 窗口里操作,两者互不干扰。
4.2 用 URI 直接打开远程路径
除了在远程终端里敲 code,本地终端也可以直接指定远程 URI:
bash复制code --folder-uri "vscode-remote://ssh-remote+dev-host/srv/www/app"
这里的 dev-host 要换成你 SSH config 里的主机名。写出这个命令之后,本地就能一键打开某个远程项目,不需要先启动 VSCode 再手动连一次 Remote-SSH。
我习惯在本地写一个小脚本,把常用的远程项目都列进去,想打开哪个就敲哪个。本质上和前面讲的本地区别不大,只不过目标变成了一组 URI,脚本统一描述性强。
4.3 没有图形界面的服务器:终端启动一个 Web 版编辑器
还有一类场景,既不想依赖本地窗口,服务器本身又没有图形界面,那可以考虑用开源方案部署一个自托管的 Web 版编辑器。它把 VSCode 改造成一个通过浏览器访问的编辑器,服务器上只需要一个进程常驻。
这和官方 code 命令不是一回事:官方 code 是 CLI 和本地 GUI 之间的桥,Web 版则需要自己部署、自己管理端口和认证。但如果你是那种「想在服务器上的代码目录里随时开一个编辑器」的人,这个方向是值得了解的。
有一点必须提:这种自托管的编辑服务不该把端口直接暴露到公网。正确的做法是只在内网使用,或者务必开启密码/令牌认证,别让服务器上的某个开发端口裸奔。安全这件事,远程开发里永远排在功能前面。
4.4 远程场景里我踩过的几个坑
远程终端里 code 报 command not found,常见原因是对应服务器还没有被 Remote-SSH 成功连接过,VSCode Server 组件没装上去。先本地用 Remote-SSH 正常连一次,再回远程终端试。
另一种情况是,明明在远程终端里执行了 code .,打开的却是本地文件夹。多半是会话没有落在远程 shell 里,或者本地的 PATH 里有个什么脚本抢先拦截了 code。先 which code 看它指向哪里,再判断。
还有一个容易忽视的:远程机器自己的 shell 配置文件里,如果你配过 code 的 alias,可能覆盖掉 VSCode Server 提供的这个命令。远程开发时尽量不要给它另起别名,免得和本地行为对不上。
5. 真正让我舒服的三个组合操作与踩坑记录
5.1 工作流一:一个脚本三秒打开任意项目
项目多了之后,记忆里经常只剩「我好像有个项目叫 xxx」,但一时半会想不起它在哪个目录。写一个简单的项目选择脚本,问题就解决了。
用 Bash 自带菜单可以先跑起来:
bash复制function openproj() {
cd "$HOME/projects" || return
select dir in */; do
[ -n "$dir" ] && code "$dir"
break
done
}
想要更顺滑,可以用模糊查找工具,选择体验会好很多:
bash复制function openproj() {
local dir
dir=$(find "$HOME/projects" -maxdepth 1 -type d | fzf --prompt="open > ")
[ -n "$dir" ] && code "$dir"
}
把函数写进 .zshrc 或 .bashrc 之后,每天第一次打开终端的动作就变成了:敲 openproj,选中项目,窗口打开。寻找目录、点击图标这些步骤全部消失。
5.2 工作流二:git diff 和提交信息的 VSCode 化
前面配了 core.editor 之后,提交信息这块已经完全 VSCode 化了。但 Git 的 diff 也可以交给 VSCode,让每次 Review 改动时的体验和日常看文件差异完全一致:
bash复制git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --diff "$LOCAL" "$REMOTE"'
git config --global difftool.prompt false
配置好之后,想仔细看某个文件的改动,执行:
bash复制git difftool --extcmd=code
它会把改动前后的内容丢给 VSCode 的差异视图,比终端里密密麻麻的加号减号直观多了。我现在的习惯是:git diff 在终端里快速扫一遍改动范围,git difftool 深看具体文件,git commit 时挂 VSCode 写信息。一条完整的 Git 工作链,全程不离开编辑器和终端。
5.3 工作流三:从日志输出直接跳转到对应代码
有一次我在查一个服务告警,日志里输出的错误格式是:
text复制[FAIL] src/worker.py:42 assertion error
以前的处理方式是复制 src/worker.py,打开文件,肉眼数行。现在可以直接提取 src/worker.py:42 传给 code --goto:
bash复制grep "\[FAIL\]" log.txt | head -1 | sed -E 's/.*\[FAIL\] ([^ ]+).*/\1/' | xargs code --goto
思路其实很简单:凡是能输出 文件:行号 的工具,都可以接到 code --goto 后面。编译器、测试框架、静态检查工具、自定义脚本,全都通用。我后来甚至在 shell 里放了一个小函数:
bash复制function goto() {
code --goto "$1"
}
配合 Ctrl+R 历史搜索,从看到错误到跳到出问题的那一行,只需要几秒。
5.4 我实测遇过的几个坑
| 症状 | 可能原因 | 解决办法 |
|---|---|---|
code 提示 command not found |
PATH 没有包含 VSCode 的 bin 目录,或终端没重开 | which code 查看,必要时手动补 PATH |
终端执行 code 后一直卡住 |
触发了 --wait,编辑器窗口还没关闭 |
检查命令是否带了 -w;关闭被打开的窗口后再继续 |
| Git Bash / Windows 终端下路径乱掉 | Windows 路径与 MSYS 路径转换导致 | 用 cygpath 转换后再传给 code --diff 等参数 |
| WSL 里打开的是 Windows 侧目录 | 手写了 C:\... 这类 Windows 路径 |
在 WSL 路径下直接 code .,让它自己处理映射 |
还有一个好记的错误:有人在 .bashrc 里早就把 c 设置成了某个自定义命令的缩写,后来想用 code 却发现怎么都不对,结果是被自己的 alias 劫持了。排查 alias 也是这类问题里很需要注意的一环。
用到现在,我最大的体会是:code 命令的价值不是省那一两次点击,而是把「打开编辑器」从一次需要通过鼠标寻找、点击、等待的 GUI 操作,变成了一嗓子就能喊出来的日常动作。最后分享一个小技巧,如果你也经常快速改某个固定文件,可以在 shell 配置里放一句:function notes() { code ~/notes/todo.md; },之后想记东西就敲 notes。终端里的 VSCode 用久了之后,你是很难再回到「先从文件夹开始找」的工作方式里的。
