terminal.integrated.cwd是唯一控制新建终端起始路径的配置项,仅在新建终端时生效,支持${workspaceFolder}等有限变量,不支持${fileDirname},多根工作区取活动根,需关闭已有终端才可见效。

terminal.integrated.cwd 是唯一控制新建终端起始路径的配置项
VSCode 不靠 shell 初始化脚本、也不靠 profile 切换来改终端默认路径,真正起作用的只有 terminal.integrated.cwd 这一个设置。它只在你点「+」或按 Ctrl+Shift+` 新建终端时读取一次,决定那个终端一打开就在哪。
常见错误现象:
- 改了设置但已有终端没变化 → 正常,该配置对已运行终端完全无效
- 填了
"${fileDirname}"却总跳到用户主目录 → 该变量在terminal.integrated.cwd中不被解析,会被当字面字符串处理 - 设置了全局路径,结果所有项目都进同一个文件夹 → 工作区级配置未覆盖,导致全局值生效
用 ${workspaceFolder} 是最稳的通用方案
只要你是通过 File → Open Folder 打开的项目(即有明确工作区根),"terminal.integrated.cwd": "${workspaceFolder}" 就能确保每次新开终端都落在项目根下。
这个变量的行为很确定:
- 有活动工作区 → 展开为该文件夹的绝对路径
- 只打开了单个文件(没 Open Folder)→ 退化为
${fileDirname},即文件所在目录 - 连文件都没打开 → 最终 fallback 到
${userHome}
Windows 用户注意:"C:\my\project" 要写成 "C:/my/project" 或 "C:\my\project",否则 JSON 解析失败。
多根工作区下 ${workspaceFolder} 指的是「当前活动编辑器所属的根」
如果你开了 A、B 两个文件夹,当前编辑器标签页里打开的是 B 文件夹里的 src/index.ts,那 ${workspaceFolder} 就是 B 的路径,不是 A,也不是拼起来的路径。
这意味着:
- 不能靠这个变量让终端“自动跳到任意文件所在目录”,它只认工作区根
- 如果想在 B 里开终端却总进 A,说明当前活动编辑器不在 B 的文件里(比如焦点在设置页、空标签页或 A 里的文件)
- 多根工作区建议统一用工作区级设置(即每个文件夹下放
.vscode/settings.json),避免全局配置干扰
需要“打开就 cd 到当前文件夹”?得绕开 cwd 配置,用命令
terminal.integrated.cwd 天然不支持动态路径,所以硬写 "${fileDirname}" 没用。真要实现「当前文件在哪,终端就开在哪」,必须用 VSCode 原生命令:
- 命令 ID:
terminal.createTerminalInActiveFileDirectory - 没有默认快捷键,需手动绑定:打开
Ctrl+K Ctrl+S→ 搜索该命令 → 点「+」加快捷键(比如Ctrl+Alt+T) - 执行前提:当前必须有一个已打开且处于激活状态的文件标签页;空标签页或设置页会报 “No active file”
这个命令新开的终端,会直接执行 cd /path/to/that/file/dir,而不是靠 cwd 设置——这才是它能动态生效的原因。
最容易被忽略的一点:改完 terminal.integrated.cwd 后,必须关掉所有已有终端再点 +,否则永远看不到效果。很多人卡在这一步,反复修改 settings.json 却以为配置失效。


















