2009-11-30 9 views
8

Estoy tratando de arreglar un nuevo archivo de sintaxis de vim para algún formato personalizado que estoy usando. Puedo entender la mayor parte, pero la palabra clave "contiene" me está causando problemas.Vim archivos de sintaxis ... tratando de comprender "contiene"

¿Hay alguien aquí que pueda darme una explicación de lo que hace (he leído la ayuda -> no lo entendí del todo) de una manera como si se lo estuviera explicando a un árbol.

+0

Eche un vistazo a los archivos de sintaxis existentes en $ VIMRUNTIME/sintaxis, muchos de ellos usan la palabra clave 'contains'. –

Respuesta

21

En general, solo puede tener un método de resaltado de sintaxis en un solo lugar. Por lo tanto, para usar sintaxis tipo C como ejemplo, si define una región para comenzar en un paréntesis de apertura '{' y termina en un paréntesis de cierre '}', el resaltado de sintaxis para esa región será el mismo.

contains= le permite configurar otros grupos de resaltado de sintaxis que se incluirán dentro de un grupo externo. Para seguir el ejemplo anterior, es posible que desee que se resalte int, incluso cuando se encuentre en la región exterior. A continuación, puede tener algo como:

syn keyword Keyword int 
syn region BraceBlock start='{' end='}' contains=Keyword 

Es bastante común que necesite agregar elementos más adelante a la lista de palabras clave contenidas. Hay algunas maneras de hacer esto. En primer lugar, puede usar contains=ALL o contains=ALLBUT,Error para permitir que cualquier cosa esté en una región. En segundo lugar, puede utilizar containedin para empujar algo en el contiene de otra región:

syn region BraceBlock start='{' end='}' 
syn keyword Keyword int containedin=BraceBlock 

En tercer lugar, se puede definir cualquier cosa que está "contenido" como válidas en este grupo:

syn region BraceBlock start='{' end='}' contains=CONTAINED 
syn keyword Keyword int contained 

Por último, puede utilizar grupos, que hacen que sea muy fácil decidir dónde va:

syn region BraceBlock start='{' end='}' [email protected] 
syn keyword Keyword int 
syn cluster MyCluster contains=Keyword 
syn keyword Conditional if else 
syn cluster MyCluster add=Conditional 
" Now conditionals and keywords can appear in a BraceBlock 

sin saber exactamente lo que quiere entender, no estoy seguro de qué más decir - lo ¿Estás tratando de lograr y qué te está causando problemas?

+0

Entonces, si entiendo correctamente, es una forma de definir las reglas dentro de las reglas, por así decirlo. Por ejemplo, haga coincidir todo entre paréntesis ... y luego, ¿otra regla para hacer coincidir "algo" dentro de una selección entre paréntesis? (¿Estoy incluso en el camino correcto)? – Rook

+0

@ldigas: es un buen resumen. Tenga en cuenta que el "algo" interno puede estar dentro del grupo externo (si agrega la palabra clave "contenida" al elemento interno, como el tercer ejemplo anterior) o en el grupo externo y en cualquier otro lugar (si no agrega la palabra clave "contenida"). – DrAl

+0

Por favor, explícame el uso de 'contenido'. En el tercer punto, 'syn region BraceBlock start = '{' end = '}' contiene = CONTAINED' y la línea debajo de él, – Harshiv

Cuestiones relacionadas