You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在JavaScript带标签模板字符串中注入嵌入式语言——语法injectionSelector属性配置方法

解决JavaScript带标签模板字符串的语法注入范围问题

要实现只针对带标签的模板字符串注入语法规则,你需要调整injectionSelector的选择器逻辑,精准过滤出带标签的模板结构,而不是匹配所有模板字符串。

正确的injectionSelector配置

直接使用下面的选择器即可满足需求:

"injectionSelector": "L:string.template.js:has-ancestor(meta.tagged-template.js)"

选择器逻辑详解

这个选择器分两部分协同工作:

  • L:string.template.js:基础定位所有JavaScript模板字符串的语法scope,这是你原本使用的匹配规则。
  • :has-ancestor(meta.tagged-template.js):通过伪类筛选出被meta.tagged-template.js scope包裹的模板字符串。在JavaScript的TextMate语法定义中,带标签的模板(比如myparser...``)整个结构会被标记为meta.tagged-template.js,里面的模板字符串是它的子节点;无标签的模板字符串则没有这个父级scope,自然会被排除在外。

对你的代码示例的匹配效果

  • 第一行无标签模板:const notTagged = do not inject here;
    它的模板字符串不属于meta.tagged-template.js的子节点,不会被选中注入。
  • 第二行带标签模板:const tagged = myparserFoo(1 , (1+ 41));
    这个模板字符串被meta.tagged-template.js包裹,会被精准匹配并应用你的语法规则。

进阶:匹配特定标签的模板字符串

如果你后续需要只针对某个特定标签(比如myparser)的模板字符串注入,还可以进一步缩小范围:

"injectionSelector": "L:string.template.js:has-ancestor(meta.tagged-template.js meta.tagged-template.tag.js.identifier='myparser')"

内容的提问来源于stack exchange,提问作者Pochi

火山引擎 最新活动