我可以在 Sublime Text 语法中合并捕获吗?

Can I combine captures in Sublime Text syntax?

我正在为 V 编写语法,它定义了与 Go 语法相似的方法,其中:

fn (o MyStruct) my_function(a int) {
  // ...
}

我可能会使用类似的东西(我会将其分解为 push,但为了简洁起见):

variables:
  ident: \b[A-Za-z_][A-Za-z_0-9]*\b

contexts:
  fn:
    - match: (fn)\s*\({{ident}}\s*({{ident}})\)\s*({{ident}})
      captures:
        1: keyword
        2: entity.name.type.v
        3: entity.name.function.v

但问题是 MyStructmy_function 是分开索引的,所以同名的方法(str() 是一个很好的例子)对于索引器来说将不会是不同的。有什么方法可以将它们组合成单个 entity.name.function.v 的值 MyStruct.my_function?

我知道我可以将整个定义视为实体,但这太冗长了,并且在拆分成多行时不起作用:

captures:
  0: entity.name.function.v

如果您将 unbroken/continuous 范围应用于文本,您可以将其定位在 .tmPreferences 文件中(与默认的 entity.name 范围相反)并对其进行索引,然后制作使用“符号索引转换”删除 ) 和空格。

    - match: (fn)\s*\({{ident}}\s*(({{ident}})\)\s*({{ident}}))
      captures:
        1: keyword
        2: meta.indexed-unit.v
        3: entity.name.type.v
        4: entity.name.function.v

现在范围 meta.indexed-unit.v 将适用于文本 MyStruct) my_function

符号索引转换基本上是适用于索引符号的正则表达式替换:

https://docs.sublimetext.io/reference/symbols.html#settings-subelements

因此您的 .tmPreferences 文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>scope</key>
  <string>source.v meta.indexed-unit.v</string>
  <key>settings</key>
  <dict>
    <key>showInIndexedSymbolList</key>
    <string>1</string>
    <key>symbolIndexTransformation</key>
    <string>
       s/\)\s*//;
    </string>
  </dict>
</dict>
</plist>