Jakiś czas temu postanowiłem dowiedzieć się więcej o tym, jak działają pliki składniowe vima, tworząc własne. Moim celem było stworzenie prostego pliku składniowego, który podzieliłby ten plik na 3 części w oparciu o ograniczniki i zawierał istniejące pliki składniowe dla dwóch z tych trzech części.
To jest przykładowy plik:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
Celem było zastosowanie git.vimtylko do dziennika i diff.vimtylko do różnicy, z wyłączeniem dwóch nagłówków. 1 Tak wyglądał mój plik składni:
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"
Zwróć uwagę, że endw pierwszym regionie jest taki sam, jak startw drugim regionie. To nie działa; drugi region najwyraźniej nie został wykryty i nie zastosowano podświetlania składni.
Mogę sprawić, by działało, poluzowując wyrażenie regularne do end=/^===/i start=/=== Diff/, aby regiony się nie dotykały, ale nie lubiły tego szczególnie - mniej oczywiste jest, że jeden powinien zacząć się tam, gdzie kończy się drugi.
Czy istnieje sposób, aby pozwolić dwóm definicjom regionu dotknąć tych samych znaków (i / lub uczynić pasujące krawędzie wyłącznymi zamiast włączających), czy też utknąłem z luźniejszym wyrażeniem regularnym?
1 (Tak, wiem, git.vimobejmuje diff.vim, ale to było ćwiczenie edukacyjne)
:h :syn-pattern-offset), lub poprzez zmianę regionu GitLog, aby rozciągał się na koniec pliku, i regionu Diff, aby był całkowicie wewnątrz regionu GitLog . Nie mogłem jednak uruchomić żadnej z tych metod.