必须用 cmd 数组,因其由 Sublime 自动处理参数拼接、空格路径和跨平台兼容;shell_cmd 在 Windows 上不解析 $file、不认 && 且易因路径无引号报错。

cmd 和 shell_cmd 到底该用哪个
必须用 cmd 数组,别碰 shell_cmd。前者由 Sublime 自动拼接参数、处理空格路径、跨平台兼容;后者在 Windows 上几乎必崩——$file 不被 cmd.exe 解析,含空格的路径(如 C:Program Filesmingw64ing++.exe)不加引号就直接报 “不是内部或外部命令”,&& 连接符也不认。
正确写法示例:
"cmd": ["g++", "-std=c++17", "-g", "$file", "-o", "$file_base_name.exe"]
错误写法示例:
"shell_cmd": "g++ -std=c++17 $file -o $file_base_name.exe"
-
cmd是安全默认项,所有平台行为一致 - Windows 绝对路径需双反斜杠 + 双引号包裹:
"cmd": ["C:\Program Files\mingw64\bin\g++.exe", "$file"] - macOS/Linux 推荐用
which g++查真实路径,避免依赖模糊的g++别名
selector 决定构建系统是否自动启用
它不是“文件后缀匹配”,而是匹配当前文件的 syntax scope。比如 .cpp 文件必须高亮为 C++ 语法,右下角显示 C++,且按 Ctrl+Shift+P → 输入 show scope 回车后能看到 source.c++,selector 才能生效。
常见 scope 值:
- C 文件:
"selector": "source.c" - C++ 文件:
"selector": "source.c++" - Python 文件:
"selector": "source.python"
如果 scope 不对,Build System 就不会出现在 Tools → Build System 菜单里,更不会响应 Ctrl+B。
file_regex 控制双击错误跳转是否有效
这个字段决定编译出错时,你双击底部面板里的报错行,能不能自动跳到对应源码位置。它靠正则提取文件路径和行号,写错等于白配。
GCC/Clang 输出格式是 main.cpp:12:5: error:,对应正则应为:
"file_regex": "^([^:]*):([0-9]+):([0-9]+):"
Python 错误格式是 File "test.py", line 42,,对应正则则是:
"file_regex": "^[ ]*File "([^"]*)", line ([0-9]*)"
- 正则必须完全匹配输出开头,否则提取失败
- 括号要严格对应:第1组是文件路径,第2组是行号,第3组(如有)是列号
- 双击无效?先检查终端里手动运行
g++ main.cpp的原始输出格式,再调正则
working_dir 和 env 是解决乱码与路径问题的关键
working_dir 默认是项目根目录,但 C/C++ 编译常依赖当前文件所在目录下的头文件或资源。设成 "$file_path" 才能让 #include "utils.h" 正确解析。
env 字段用来覆盖环境变量,最常用的是防中文乱码:
"env": {"PATH": "C:\msys64\ucrt64\bin;${PATH}", "PYTHONIOENCODING": "utf-8"}
- Windows 下中文路径编译失败?优先检查
PATH是否包含 MinGW-w64 的bin目录 - 输出中文变问号或方块?加
"PYTHONIOENCODING": "utf-8"(对 Python 构建)或确保终端编码一致 -
$file只在已保存文件中展开;未保存的Untitled标签页会变为空字符串,导致命令静默失败
selector 和 file_regex 的耦合性——scope 错了,整个构建系统就不触发;正则错了,错误跳转就失效。这两处没调通,其他参数再完美也白搭。


















