按 ctrl+shift+p 输入 show scope name 回车,状态栏显示完整 scope 链,如 source.js keyword.control.js;必须用带语言后缀的全名(如 keyword.control.python)而非仅 keyword 才能生效。

怎么确认当前关键字的实际 scope 名?
别靠猜,if 或 return 在不同语言里作用域完全不同。光标停在目标词上,按 Ctrl+Shift+P(macOS 是 Cmd+Shift+P),输入 Show Scope Name 回车——状态栏立刻显示完整链,比如:source.js keyword.control.js 或 source.python keyword.control.python。
常见陷阱:
- 只复制
keyword就去改配色文件,结果没生效:因为真正起作用的是带语言后缀的全名 - 在 .jsx 文件里查到的是
support.class.react,不是keyword:说明它被 Babel 插件识别为 React 类型,而非原生 JS 关键字 - 查出来是
invalid.illegal:说明语法文件里某条规则正则写崩了,匹配失败后 fallback 到非法标记
自定义 .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列表里必须明确写出你的后缀,比如- xyz;写成- .xyz或漏掉短横线,绑定就失效
为什么写了 match 规则却没高亮?
90% 的问题出在匹配顺序或 scope 被吞掉,不是正则写错了。
典型场景:
- 你写了字符串引号规则
match: '"[^"]*"' scope: string.quoted.double.mylang,又写了关键字规则match: '\b(if|else)\b' scope: keyword.control.mylang,但把字符串规则放在前面——那么"if"整个被当字符串捕获,里面的if永远不会触发关键字规则 - 用了
push进入子 context,但没写pop: true或没匹配到终止符,导致后续所有代码都被困在那个 context 里,不再执行 main 下其他规则 - 正则用了
.*这种贪婪匹配,吃掉了本该留给下一条规则的字符,建议用[^"]*或\S+等更克制的写法
怎么让新语法的颜色真正显示出来?
语法文件只是定义“这是什么”,颜色由 .sublime-color-scheme 决定。改错地方等于白干。
操作路径:
- 先用
Show Scope Name查出实际 scope,比如keyword.control.mylang - 按
Ctrl+Shift+P输入PackageResourceViewer: Open Resource,选 Color Scheme → 当前主题 → 打开其.sublime-color-scheme文件 - 复制一份到
Packages/User/下(如MyTheme.sublime-color-scheme),并在用户设置里显式指定:"color_scheme": "Packages/User/MyTheme.sublime-color-scheme" - 在
rules数组末尾加一条:{"scope": "keyword.control.mylang", "foreground": "#D81B60"}
注意:ST4 实时生效,ST3 建议重启;别直接改系统主题里的 .tmTheme,那是 XML 格式,ST4 已不推荐使用。











