es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para combinar los identificadores MyStruct y my_function en un solo valor entity.name.function.v, puedes modificar la sección de captures en el contexto fn para incluir un nuevo grupo de captura que concatene los dos identificadores usando un separador como un punto (.).

    Aquí tienes un ejemplo:

    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
            4: entity.name.function.v      # nuevo grupo de captura
          push:
            - meta_scope: meta.class.method.v
            - match: '\{'
              pop: true
        - match: ',\s*({{ident}})\s*({{ident}})'
          captures:
            1: variable.parameter.v
            2: storage.type.v
    

    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 y 3) con un separador punto. El valor resultante de entity.name.function.v será algo como MyStruct.my_function.

    Ten en cuenta que también he agregado un meta_scope a la sección push 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.

Comments are closed.