¿Se pueden hacer que las regiones de sintaxis vim se toquen / se superpongan?


13

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.vimsolo al registro y diff.vimsolo 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 enden la primera región es lo mismo que starten 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.vimincluye diff.vim, pero este fue un ejercicio de aprendizaje)


Creo que esto debería ser posible mediante el uso de un desplazamiento "Fin de región" para hacer que los bordes sean exclusivos (ver :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.
Rico

Probarlo se hizo un poco más difícil por el hecho de que, como notará, git.vim ya destaca la salida diff. ¡Podría ser una idea alterar su ejemplo en consecuencia!
Rico

Respuestas:


4

Puedes decirle a Vim regex engine dónde comenzar el próximo partido.

Hasta ahora sé que hay 2 formas:

  1. Use \zepara establecer el final de un partido:

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. Utilice la búsqueda anticipada positiva \@=, que se denomina coincidencia de ancho cero en Vim:

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\(^===* Diff\)\@=/
        \ contains=@gitlog
    

Por lo que el final de su partido "puntero" tipo de retrocede hasta el principio de ^===* Diffla línea, de modo que region Diff's startcomenzarán su juego en ^===* Difflínea de nuevo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.