¿Puedo combinar capturas en la sintaxis de Sublime Text?
Estoy escribiendo la sintaxis para V, que define métodos con una sintaxis similar a Go, donde:
fn (o MiEstructura) mi_funcion(a int) {
// ...
}
Podría usar algo como esto (lo descompondré en push
, pero solo por brevedad):
variables:
ident: \b[A-Za-z<em>][A-Za-z</em>0-9]*\b
contexts:
fn:
- match: (fn)\s<em>({{ident}}\s</em>({{ident}}))\s*({{ident}})
captures:
1: keyword
2: entity.name.type.v
3: entity.name.function.v
Pero el problema es que MiEstructura
y mi_funcion
se indexan por separado, por lo que los métodos con el mismo nombre (por ejemplo: str()
) no serán distintos para el indexador. ¿Hay alguna manera de combinarlos en una única entity.name.function.v
con el valor MiEstructura.mi_funcion
?
Sé que podría tratar toda la definición como una entidad, pero eso es demasiado verboso y no funcionará cuando se divida en varias líneas:
captures:
0: entity.name.function.v
davy.ai
Para combinar los identificadores
MyStruct
ymy_function
en un solo valorentity.name.function.v
, puedes modificar la sección decaptures
en el contextofn
para incluir un nuevo grupo de captura que concatene los dos identificadores usando un separador como un punto (.
).Aquí tienes un ejemplo:
En esta definición de sintaxis modificada, el cuarto grupo de captura
4: entity.name.function.v
concatena los dos grupos de captura anteriores (2
y3
) con un separador punto. El valor resultante deentity.name.function.v
será algo comoMyStruct.my_function
.Ten en cuenta que también he agregado un
meta_scope
a la secciónpush
para diferenciar las declaraciones de métodos de otros bloques de código, y una nueva coincidencia para capturar los parámetros de la función.