应限定scope为comment而非全文匹配,因Highlight插件先按scope过滤再执行regex,仅当scope设为comment或其子类(如comment.line.double-slash)时,regex "(TODO|FIXME|XXX)"才精准匹配注释内关键词。

为什么TODO会误匹配字符串或变量名
直接用 TODO 这类正则全局匹配,Sublime 会把代码里所有出现的 TODO 字母组合都标出来——比如 const TODO_LIST = [] 中的 TODO、或者字符串 "TODO is not done" 里的 TODO。这不是高亮,是污染。
根本原因是:正则没限定上下文,而语法层面,注释(comment)和字符串(string)、变量名(variable)属于完全不同的 scope。你真正要捕获的,只是“被语法识别为注释的那一段文本里的 TODO”。
-
scope必须设为comment或更细粒度的comment.line.double-slash/comment.block,不能留空或填source - 别信网上抄来的
"scope": "source"配置——它等于没限制,所有地方都扫 - 如果语言语法没把某段
// TODO打上commentscope(极少见),先用Ctrl+Shift+P → Developer: Show Scope Name确认光标停在//上时状态栏末尾显示的是什么 scope
Highlight 插件中 scope 和 regex 的配合逻辑
Highlight 插件不是简单地“在全文跑正则”,而是先按 scope 过滤出符合条件的文本块(比如只看所有被标记为 comment 的区域),再在这些块内部执行 regex。这是实现“仅注释内高亮”的关键链路。
- 配置里
"scope": "comment"是硬性前提,缺了这行,regex 再准也没用 -
regex只需匹配词本身,不用写//s*TODO这种带前缀的——因为 scope 已经确保你只在注释里找 - 推荐正则:
"\b(TODO|FIXME|XXX)\b"(注意 JSON 里反斜杠要双写);\b防止匹配TODOING,但不要用^或$,它们在跨行注释里会失效 - 如果项目用多语言(如 JS/Python/Go),且各语言注释 scope 不同,可写多个规则,分别指定
"scope": "comment.line.number-sign.python"等
常见失效场景与绕过方式
即使配置看起来正确,也可能看不到高亮——多数情况不是插件问题,而是作用域链路断在了前端。
- 当前文件没被正确识别为对应语言(右下角显示
Plain Text)→ 点击右下角手动选JavaScript或Python - 用了自定义语法(如
.sublime-syntax)但没把注释打上commentscope → 用Show Scope Name检查,若显示mylang.todo而非comment,就得改语法定义,或把 Highlight 的scope改成那个自定义值 - 颜色被主题覆盖:有些轻量主题没定义
comment的 foreground,导致高亮色被吞 → 临时换Monokai主题验证,或直接在 color scheme 里加一条"scope": "comment"的规则 - 重启 Sublime 不必要,改完 Highlight 设置后,保存即生效;但改了 color scheme 文件必须重启或重载(
Ctrl+Shift+P → Reload Color Scheme)
不依赖插件的底线方案:用 Find All 临时聚焦
当插件失效又没时间调试时,Ctrl+F → (TODO|FIXME) → .* 按钮开启正则 → Find All 是最快回血手段。虽然不持久、不跨文件,但它能立刻把当前文件所有匹配项卷到视图顶部,并高亮显示。
- 优点:零配置、10 秒启用、兼容所有版本
- 缺点:关闭查找框就消失;无法区分注释/字符串;不响应鼠标悬停或跳转
- 技巧:按
Alt+Enter把所有结果转成多光标,再手动删掉非注释行的匹配(适合小范围清理)
真正的限制不在正则,而在 scope。你得先让 Sublime “知道哪段是注释”,它才肯只在那儿找 TODO。否则所有花式正则都是往整个文件里撒网,捞出来的必有噪音。
















