必须用Ctrl+Shift+P输入Show Scope Name确认真实scope(如source.js keyword.control.js),而非仅keyword;自定义.sublime-syntax需严格满足路径、scope前缀、文件名、file_extensions格式,default_syntax配置须精确到Packages/路径且防插件覆盖。

Sublime Text 的语法高亮不是“开关式”配置,而是由 .sublime-syntax(或旧版 .tmLanguage)文件定义规则、再由 color_scheme 映射颜色——改错一个路径、漏掉一个短横线、scope 写错后缀,都会导致高亮静默失效。
怎么确认当前词的真实 scope?别靠猜
if、return、$arg_foo 在不同语言里作用域完全不同,直接改配色方案没用。光标停在目标词上,按 Ctrl+Shift+P(macOS 是 Cmd+Shift+P),输入 Show Scope Name 回车,状态栏立刻显示完整链,例如:
-
source.js keyword.control.js—— 表示这是 JavaScript 中的控制关键字 -
source.nginx string.unquoted.nginx—— 表示 Nginx 配置里的无引号字符串 -
invalid.illegal—— 表示语法文件某条正则匹配失败,已 fallback 到非法标记
常见错误:只复制 keyword 就去改 color scheme,结果没生效——真正起作用的是带语言后缀的全名,比如 keyword.control.js,不是 keyword。
自定义 .sublime-syntax 文件必须踩准的硬性条件
Sublime 不接受“差不多对”,路径、命名、字段缺一不可。用 Tools → Developer → New Syntax… 生成模板起步,别手敲 YAML。关键检查点:
- 保存路径必须是
Packages/User/mylang/mylang.sublime-syntax(Windows/macOS/Linux 都从Packages/开始,别写绝对路径) -
scope字段值必须以source.开头,例如scope: source.mylang;写成mylang或text.mylang,主题根本找不到映射 - 文件名必须以
.sublime-syntax结尾,且大小写敏感:MyLang.sublime-syntax可用,mylang.syntax或MyLang.sublime-syntax.bak都无效 -
file_extensions列表里必须明确写出后缀,格式为 YAML 列表:- xyz;写成- .xyz或漏掉短横线,绑定就失效
为什么写了 match 规则却没高亮?90% 是顺序或 context 问题
不是正则写错了,而是匹配逻辑被吞掉。Sublime 按 contexts 里规则的书写顺序逐条执行,先匹配到谁,就归谁管。
- 字符串规则
match: '"[^"]*"' scope: string.quoted.double.mylang放在关键字规则前面 → 那么"if"整个被当字符串捕获,里面的if永远不会触发关键字规则 - 用了
push:进入子 context,但没写pop: true或没匹配到终止符 → 后续所有代码都被困在那个 context 里,不再执行main下其他规则 - 正则用了
.*这种贪婪匹配 → 吃掉了本该留给下一条规则的字符;建议用[^"]*或\S+等更克制的写法
验证方法:用 Ctrl+Shift+P → Inspect Scope 把光标停在目标词上,看弹出的 scope 是不是你写的(如 keyword.control.mylang)。如果不是,说明没匹配上。
怎么让新文件一打开就有高亮?default_syntax 配置陷阱
新建文件(Ctrl+N)默认是 Plain Text,这不是遗漏功能,而是 Sublime 压根不记你上次用啥语法。想让它一开就是 JavaScript 高亮,必须显式配置 default_syntax,且路径必须精确到 .tmLanguage 文件。
- 先打开一个已正确识别为 JavaScript 的
.js文件,右下角点语言名 →Open all with current extension as…,看它的全称,比如Packages/JavaScript/JavaScript.tmLanguage - 打开
Preferences → Settings – User,在右侧 JSON 中加一行:"default_syntax": "Packages/JavaScript/JavaScript.tmLanguage" - 如果写成
JavaScript、js或漏掉Packages/前缀,Sublime 会静默忽略该行,回退到默认行为 - 插件冲突(如
ApplySyntax)会劫持新建文件逻辑,优先级高于default_syntax;可临时禁用它验证是否生效
最易被忽略的是:项目级或语法级设置(如 JavaScript.sublime-settings)优先级高于全局用户设置,会覆盖你写的 default_syntax —— 这类覆盖没有提示,只能靠排查。


















