sublime build system本质是调用命令行工具而非语法检查器,它通过json配置执行php -l、iverilog -t null等外部命令实现语法检测,依赖环境path且需file_regex提取错误位置,不实时、不替代sublimelinter。

Sublime Build System 本质是调用命令行工具,不是语法检查器
Build System 本身不检测语法,它只是把你的文件路径传给外部命令(比如 php -l、python -m py_compile、iverilog -t null),再把 stdout/stderr 显示在 Sublime 控制台里。所谓“语法检测”,其实是借用了语言解释器/编译器自带的语法验证能力。
这意味着:如果终端里 php -l test.php 不报错,Build System 就不会标出错误;反之,如果命令根本运行不了(比如 php 不在 PATH),Build System 会直接显示 [Errno 2] No such file or directory,而不是“语法正确”。
- Build System 不依赖 SublimeLinter 框架,也不需要插件,纯 JSON 配置就能跑
- 它只在你按
Ctrl+B(Windows/Linux)或Cmd+B(macOS)时触发,不是实时的 - 适合做“保存后一键校验”,尤其对 PHP、Verilog、Python 等解释型/编译型语言很稳
写一个能工作的 PHP 语法检测 Build System
PHP 自带 -l(lint)参数,执行快、无副作用,是最干净的语法检查方式。关键不是写多 fancy 的 JSON,而是确保 php 命令能被 Sublime 找到。
新建 Build System:Tools → Build System → New Build System,粘贴以下内容并保存为 PHP Syntax Check.sublime-build:
{
"cmd": ["php", "-l", "$file"],
"selector": "source.php",
"file_regex": "Parse error:.*?in (.+?) on line ([0-9]+)",
"working_dir": "$file_path"
}
file_regex 是重点:它让 Sublime 能把错误行号和文件路径提取出来,双击错误就能跳转。没这行,控制台只打印一堆文字,没法定位。
- 若
php -v在终端失败,必须先装好 PHP CLI,并在系统 PATH 中;Sublime GUI 启动时不继承 shell 的 PATH,可改用终端启动:subl . - 扩展名非
.php(如.phtml、.inc)需先手动绑定语法:View → Syntax → Open all with current extension as… → PHP - 想支持多后缀,改
selector为"source.php, source.phtml, source.inc"(注意逗号后空格)
Verilog 用 iverilog 做语法检测要绕过“-o”输出陷阱
iverilog 默认要求指定输出目标(-o out),但语法检测只需要确认能否成功解析,不需要生成文件。强行加 -o 会导致 Build System 每次都生成临时文件,还可能因路径权限失败。
正确做法是用 -t null(target null)——它只做词法/语法分析,不生成任何输出:
{
"cmd": ["iverilog", "-t", "null", "$file"],
"selector": "source.verilog",
"file_regex": "(\S+?):([0-9]+): ([^\n]+)",
"working_dir": "$file_path"
}
注意:iverilog 安装时必须勾选“Add to PATH”(Windows)或确保 /usr/local/bin/iverilog 存在(macOS/Linux)。否则 Build System 会报 command not found,且不会提示你缺什么。
- 如果 Verilog 文件含
`include,需加-I参数指定头文件路径,例如"cmd": ["iverilog", "-I", "$file_path", "-t", "null", "$file"] -
selector必须匹配当前文件语法类型:右下角显示Verilog才生效;若显示Plain Text,先点它 →Open all with current extension as… → Verilog - 某些老版本 iverilog 不支持
-t null,可退而求其次用-o /dev/null(Linux/macOS)或-o NUL(Windows)
Build System 和 SublimeLinter 别混用同一个目的
Build System 是手动触发、一次性的;SublimeLinter 是自动监听、持续反馈的。两者底层都靠外部命令,但行为逻辑完全不同——试图用 Build System 实现“实时校验”,等于自己造轮子。
容易踩的坑:
- 误以为 Build System 能替代
SublimeLinter-php:后者会在你敲字时就调用php -l,还能在行号区画红点;前者只能按Ctrl+B看控制台 - 在 Build System 里硬塞
--fix类参数:像 ESLint 的--fix或 Prettier 的--write,这些不是语法检测,是代码重写,Build System 不负责处理文件变更后的刷新逻辑 - 多个 Build System 冲突:比如同时存在
PHP Syntax Check和PHP Run,Sublime 只会记住最后一个激活的;切换项目时记得手动选对
真正该花时间的地方,是确认那个外部命令(php、iverilog、python)在 Sublime 的环境下是否真能运行——其它都是次要的。











