Há algum tempo, eu decidi aprender mais sobre como os arquivos de sintaxe do vim funcionam, criando os meus. Meu objetivo era criar um arquivo de sintaxe simples que dividisse o arquivo em 3 partes com base em delimitadores e incluísse arquivos de sintaxe preexistentes para duas dessas três partes.
Este é um arquivo de exemplo:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
O objetivo era aplicar git.vim
apenas ao log e diff.vim
apenas ao diff, excluindo os dois cabeçalhos. 1 Foi assim que meu arquivo de sintaxe acabou:
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 como end
na primeira região é o mesmo que start
na segunda região. Isso não funciona; a segunda região aparentemente não é detectada e o realce da sintaxe não é aplicado.
Eu posso fazer isso afrouxando a regex para end=/^===/
e start=/=== Diff/
, para que as regiões não se toquem, mas não gostem particularmente disso - é menos óbvio que se deve começar onde a outra termina.
Existe uma maneira de permitir que duas definições de região toquem os mesmos caracteres (e / ou tornem as arestas correspondentes exclusivas em vez de inclusivas) ou estou preso ao regex mais flexível?
1 (Sim, eu sei que git.vim
inclui diff.vim
, mas este foi um exercício de aprendizado)
:h :syn-pattern-offset
), ou alterando a região GitLog para estender até o final do arquivo e a região Diff para estar inteiramente dentro da região GitLog . Eu não consegui fazer com que nenhum desses métodos funcionasse.