VSCode主题开发:Textmate作用域与语义令牌类型的区别及前景色问题
VSCode主题开发:Textmate作用域与语义令牌类型解析 + 前景色生效方案
一、Textmate Scopes 和 语义令牌类型的区别
- Textmate Scopes:靠语法解析的静态标记,基于正则匹配代码文本结构,属于语法层面的着色。比如
keyword.control、string.quoted.double这类,是编辑器通过语法文件(.tmLanguage)生成的,不管代码实际语义,只看文本格式。 - 语义令牌类型:靠语言服务的动态标记,属于语义层面的着色。比如
variable.readonly、function.method这类,是语言服务器(像TS、Python的语言服务)分析代码逻辑后生成的,能识别变量是否只读、函数是不是类方法这类实际语义。
二、解决Textmate前景色被划掉、让其生效的方法
VSCode默认优先用语义令牌的着色规则,两者冲突时Textmate的颜色会被划掉(表示被覆盖),要让Textmate生效,有两种方式:
- 覆盖语义令牌规则:在主题的
settings.json里,给Textmate规则搭配"semanticTokenScopeOverrides",强制让Textmate规则优先级更高。示例代码:
{ "editor.tokenColorCustomizations": { "[你的主题名称]": { "textMateRules": [ { "scope": "string.quoted.double", "settings": { "foreground": "#ff0000" } } ], "semanticTokenScopeOverrides": { "string": "" // 清空语义令牌中string的规则,让Textmate的规则生效 } } } }
- 关闭语义着色:如果不需要语义令牌的着色,可以直接全局关闭:
{ "editor.semanticHighlighting.enabled": false }
也可以只针对当前主题关闭:
{ "editor.tokenColorCustomizations": { "[你的主题名称]": { "semanticHighlighting": false } } }
内容的提问来源于stack exchange,提问作者周michael
相关产品推荐
相关产品推荐

