Así que hace un tiempo decidí aprender más sobre cómo funcionan los archivos de sintaxis de vim, creando el mío. Mi objetivo era crear un archivo de sintaxis simple que dividiera el archivo en 3 partes basadas en delimitadores e incluir archivos de sintaxis preexistentes para dos de esas tres partes.
Este es un archivo de ejemplo:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
El objetivo era aplicar git.vim
solo al registro y diff.vim
solo al diff, excluyendo los dos encabezados. 1 Así es como se ve mi archivo de sintaxis:
if exists("b:current_syntax")
finish
endif
syntax include @gitlog $VIMRUNTIME/syntax/git.vim
syntax region GitLog
\ start=/^===* Log/
\ end=/^===* Diff/
\ contains=@gitlog
syntax include @gitdiff $VIMRUNTIME/syntax/diff.vim
syntax region Diff
\ start=/^===* Diff/
\ end=/\n\n/
\ contains=@gitdiff
let b:current_syntax = "logdiff"
Observe cómo end
en la primera región es lo mismo que start
en la segunda región. Esto no funciona la segunda región aparentemente no se detecta y no se aplica el resaltado de sintaxis.
Puedo hacer que funcione aflojando la expresión regular end=/^===/
y start=/=== Diff/
, para que las regiones no se toquen, pero no les guste particularmente, es menos obvio que se supone que una comienza donde termina la otra.
¿Hay alguna manera de permitir que dos definiciones de región toquen los mismos caracteres (y / o hacer que los bordes coincidentes sean exclusivos en lugar de inclusivos) o estoy atascado con la expresión regular más flexible?
1 (Sí, lo sé git.vim
incluye diff.vim
, pero este fue un ejercicio de aprendizaje)
fuente
:h :syn-pattern-offset
), o cambiando la región GitLog para que se extienda hasta el final del archivo, y la región Diff para estar completamente dentro de la región GitLog . Sin embargo, no pude lograr que ninguno de estos métodos funcionara.Respuestas:
Puedes decirle a Vim regex engine dónde comenzar el próximo partido.
Hasta ahora sé que hay 2 formas:
Use
\ze
para establecer el final de un partido:Utilice la búsqueda anticipada positiva
\@=
, que se denomina coincidencia de ancho cero en Vim:Por lo que el final de su partido "puntero" tipo de retrocede hasta el principio de
^===* Diff
la línea, de modo queregion Diff
'sstart
comenzarán su juego en^===* Diff
línea de nuevo.fuente