sublime构建系统本身不支持自动格式化;真正实现“保存即格式化”需依赖插件的on_post_save_async钩子,如jsprettier、sublimeblack等,它们通过语法scope、文件扩展名和配置条件触发cli工具。

Sublime 构建系统本身不支持自动格式化
构建系统(sublime-build)只负责运行命令并捕获输出,它没有监听保存事件、解析语法类型或调用格式化器的能力。想靠改 Python.sublime-build 或加个 "cmd": ["black", "$file"] 就实现“一保存就格式化”,结果只会是:保存无反应,控制台没报错,代码原封不动。
真正起作用的是插件的 on_post_save_async 钩子
JsPrettier、SublimeBlack、AutoPEP8 这些插件能自动格式化,靠的是 Sublime 的 API 事件回调——不是构建系统。它们在文件保存后立刻被触发,再根据当前语法(scope)、扩展名、配置条件决定是否调用 CLI 工具。
- 文件右下角显示
JavaScript (Babel)?默认不触发 JsPrettier,得在设置里加"javascript (babel)": true - 文件大小超过 1MB?JsPrettier 默认跳过,不会提示,也不会报错
- 插件配置写了
"auto_format_on_save": true,但主设置Preferences.sublime-settings里也有同名项,后者会覆盖前者 - Sublime 是从桌面图标启动的 macOS 用户?GUI 应用常读不到 shell 的
PATH,必须显式填死prettier_cli_path或black_path
如果非要塞进构建系统,只能手动触发
你可以写一个构建系统来调用 prettier 或 black,但它只响应 Ctrl+B 或菜单里的 “Build”,和保存行为完全无关:
{
"shell_cmd": "prettier --write "$file"",
"file_regex": "^.*?:(\d+):?(\d+)?:? (.*)$",
"selector": "source.js, source.ts, source.json"
}
- 这个构建系统不会自动运行,必须手动执行
-
shell_cmd要确保prettier在 PATH 里,或写绝对路径如/usr/local/bin/prettier - 不处理错误码:如果
prettier找不到或文件语法错误,Sublime 只显示 “Finished”,不提示失败 - 对 Python 用户,
black命令需配合--config pyproject.toml才读项目配置,构建系统里得手动加上
容易被忽略的关键点
插件能不能动起来,不取决于你装了多少个包,而取决于三个东西是否同时对齐:CLI 工具真实存在、Sublime 能调到它、插件配置精准匹配当前文件的语法 scope 和扩展名。其中 scope 最隐蔽——比如 Vue 文件里 <script></script> 块是 source.js.embedded.html,不是 source.js,JsPrettier 默认不处理,得靠 custom_file_extensions 或 locational configs 手动开闸。











