sublime构建系统本质是调用本地已安装工具的外部命令,需确保工具可用、配置文件存于packages/user/目录、cmd用数组格式、selector精确匹配syntax scope、$file等变量仅在已保存文件中生效。

Sublime 的构建系统不是“自动编译器”,它只是调用你本地已装好的工具(如 python、tsc、sass)执行命令;没装对工具、路径写错、文件没保存,都会导致 Ctrl+B 静默失败或报错。
构建系统文件必须放在 Packages/User/ 目录下才生效
Sublime 只从两个位置加载 .sublime-build 文件:内置只读包(你改不了),以及 Packages/User/。丢在桌面、项目根目录、甚至 Packages/MyTools/ 里,菜单里根本不会出现,Ctrl+B 也毫无反应。
- 用 Preferences → Browse Packages… 打开目录,直接进
User/新建文件 - 文件名随意,但后缀必须是
.sublime-build(例如Python3.sublime-build) - 保存后如果没立刻出现在 Tools → Build System 菜单中,试试 Refresh Projects
cmd 必须是数组,Windows 路径含空格要加引号+双反斜杠
写成字符串(比如 "cmd": "python -u $file")会完全失效。Windows 下路径如 C:Program FilesPython312python.exe 不加引号,命令就被截断;不转义反斜杠,JSON 解析直接报错。
- 正确写法(Windows):
"cmd": ["C:\Program Files\Python312\python.exe", "-u", "$file"] - 正确写法(macOS/Linux):
"cmd": ["python3", "-u", "$file"](前提是which python3能查到) -
-u参数不能省——它禁用输出缓冲,否则print()内容可能卡住不显示 - 别依赖
python别名,尤其在 conda/virtualenv 环境中,它可能指向旧版本
selector 匹配的是语法作用域,不是文件后缀
右下角状态栏显示 “Python” 并不等于 scope 是 source.python。如果它显示的是 “Plain Text” 或 “JavaScript”,哪怕文件叫 test.py,构建系统也不会触发。
- 按
Ctrl+Shift+P(Win)或Cmd+Shift+P(Mac),输入 show scope 回车,看输出里有没有source.python - 常见 scope 值:
source.python、source.ts、source.scss、source.c - 写成
"selector": "python"或"selector": ".py"全部无效 - 想覆盖多个类型,用逗号分隔:
"selector": "source.scss, source.sass"
$file 变量只在已保存文件中展开,未命名标签页会静默失败
Sublime 构建系统不读内存内容,也不支持 $file_content 这种变量。未保存的 Untitled 标签页下,$file 展开为空字符串,命令变成 ["python", "-u", ""],要么报错,要么无声退出。
- 运行前务必先保存文件(
Ctrl+S/Cmd+S),哪怕临时存到桌面 -
$file_base_name、$file_path同样依赖已保存状态 - 如果需要“未保存也能试跑”,得换方案——比如用
SublimeREPL插件或切终端 - 错误跳转靠
file_regex,但正则写错(比如没匹配上File "xxx.py", line 42中的引号或空格)就等于白配
真正卡住人的从来不是 JSON 怎么写,而是不同系统对路径分隔符、空格转义、shell 环境继承的处理差异——比如 Windows 的 cmd 不认 &&,macOS 的 sh 不加载 ~/.zshrc,这些细节一漏,构建就停在无声失败那一步。











