Sublime构建系统只认语法作用域(scope)而非文件后缀;selector必须匹配如source.python等scope,且文件需已保存并正确设置Syntax,否则Ctrl+B不触发。

Sublime 构建系统不看文件后缀,只认 selector 作用域
很多人以为把 selector 写成 "*.py" 或 ".py" 就能按后缀匹配——不行。Sublime 的 selector 是语法作用域(scope),不是文件名通配符。它由当前文件的 Syntax(右下角显示的“Python”“JavaScript”等)决定,而 Syntax 又依赖于文件扩展名 + 手动设置 + 文件内容特征。所以“根据后缀自动选环境”的本质,是确保后缀 → 正确 Syntax → 正确 scope → 匹配构建系统。
selector 常见值与对应后缀的实际映射关系
Scope 不是凭空来的,它和你打开的文件后缀、Syntax 设置强绑定。常见组合如下:
-
source.python:对应.py文件,且 View → Syntax → Python 已启用(右下角显示 Python) -
source.shell:对应.sh文件,Syntax 设为 ShellScript -
source.c:对应.c文件,Syntax 设为 C -
source.cpp:对应.cpp、.cc,Syntax 设为 C++ -
source.js:对应.js,Syntax 设为 JavaScript(注意不是 “JS Custom” 或其他第三方插件语法)
如果文件是 script.py,但右下角显示的是 Plain Text,那它的 scope 就是 text.plain,哪怕你写了 "selector": "source.python" 也完全不匹配。
为什么 selector 匹配失败?三个高频原因
匹配不上,构建系统不会自动激活,Ctrl+B 就会 fallback 到“No build system”或默认空构建。
- 文件未保存:新标签页叫
Untitled,无扩展名 → Sublime 不设 Syntax → scope 为text.plain,任何source.*都不生效 - Syntax 被手动改错:比如打开
main.py后误点 View → Syntax → Plain Text → scope 变成text.plain - 插件干扰:某些语法高亮插件(如 Babel、JS Custom)会注册自己的 scope(如
source.js.jsx),原生source.js构建系统就失效了
验证当前 scope 的最快方式:光标放在文件里,按 Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(macOS),输入 Inspect Scope 回车,看弹出面板第一行。
想“按后缀运行任意文件”,得用 shell_cmd + 脚本判断
纯 JSON 构建系统做不到动态读取后缀再分发命令。真要万能运行(比如双击 test.py 用 python,build.sh 用 bash),必须绕过 selector,改用 shell_cmd 并调外部脚本:
{
"shell_cmd": "case \"$file\" in *.py) python3 -u \"$file\" ;; *.sh) bash \"$file\" ;; *.js) node \"$file\" ;; *) echo \"Unsupported extension\" ;; esac",
"selector": "source | text",
"working_dir": "$file_path"
}
注意:shell_cmd 是字符串,cmd 是数组;selector 改成 "source | text" 才能让所有文本类文件触发;Windows 不支持这种 shell 写法,得另写批处理或用 PowerShell。
真正容易被忽略的点:scope 匹配不是“可选项”,而是构建系统生效的第一道闸门。没配对 Syntax 和 selector,后面 cmd 写得再准也没用——菜单里根本看不到那个构建项,Ctrl+B 更是毫无反应。

















