code runner 默认不只运行当前文件,因其按后缀匹配命令且自动感知项目线索(如package.json);需关闭“run in terminal”和“preserve focus”,并重写executormap用$filename禁用$dir等变量。

Code Runner 默认行为为什么不是只运行当前文件
Code Runner 的 code-runner.runInTerminal 和 code-runner.executorMap 配置本质是按文件后缀匹配执行命令,它本身没有“项目”概念——所谓“启动整个项目”,其实是你当前文件所在目录下存在 package.json、go.mod、CMakeLists.txt 等构建线索,导致它调用的默认命令(比如 node、go run、cmake --build)自动向上查找或触发项目级逻辑。
要让它老老实实只跑当前文件,关键不是改插件开关,而是切断它对项目上下文的感知。
必须关闭的两个配置项
打开 VSCode 设置(Ctrl+,),搜索以下两项并**取消勾选**:
-
Code-runner: Run in Terminal→ 改为 关闭(否则终端里 pwd 是工作区根目录,容易误触项目脚本) -
Code-runner: Preserve Focus→ 改为 关闭(否则快捷键Ctrl+Alt+N后焦点还在编辑器,看不到输出,误以为没运行)
这两个选项不关,即使你写了精准命令,输出也可能被吞掉或路径错乱。
针对不同语言重写 executorMap 条目
直接修改 settings.json,覆盖默认命令,强制使用绝对路径 + 当前文件名。核心原则:所有命令里用 $fileName 或 $fileNameWithoutExt,**绝不用 $dir 或 $workspaceRoot**。
常见语言示例:
"code-runner.executorMap": {
"python": "python -u "$fileName"",
"javascript": "node "$fileName"",
"typescript": "ts-node "$fileName"",
"go": "go run "$fileName"",
"rust": "cargo run --bin "$fileNameWithoutExt""
}
注意点:
-
python加-u是为了禁用输出缓冲,否则 print 不实时 -
go run要求当前文件是main.go或包名为main,否则报no main module—— 这不是插件问题,是 Go 本身限制 -
cargo run --bin只适用于二进制 crate,如果当前是 lib 文件(lib.rs),得换用cargo script或手动测试
遇到 “command not found” 或路径错误怎么办
这不是 Code Runner 的 bug,而是 shell 找不到解释器。排查顺序:
- 在 VSCode 内置终端里手动敲
node --version或python --version,确认能执行 —— 如果不行,说明 VSCode 没继承系统 PATH,需重启 VSCode 或在设置里加"terminal.integrated.env.windows": { "PATH": "..." } - 检查文件名是否含空格或中文 ——
"$fileName"用双引号包裹就是防这个,但某些旧版 shell 仍可能崩,建议先用英文命名 - Go / Rust 用户注意:确保当前文件所在目录不是模块根(即没有
go.mod/Cargo.toml),否则go run a.go会尝试构建整个模块
最硬核的兜底办法:把 executorMap 命令改成完整路径,比如 "python": "/usr/bin/python3 -u "$fileName""(macOS/Linux)或 "python": "C:\Python39\python.exe -u "$fileName""(Windows)。
真正卡住的往往不是配置,而是你忘了当前文件根本不在可执行上下文中——比如想用 go run 跑一个没 func main() 的文件,或者 node 跑一个 ES Module 但没配 "type": "module"。这时候插件再听话也没用。











