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.vim
tylko do dziennika i diff.vim
tylko 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 end
w pierwszym regionie jest taki sam, jak start
w 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.vim
obejmuje diff.vim
, ale to było ćwiczenie edukacyjne)
źródło
: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.Odpowiedzi:
Możesz powiedzieć silnikowi Vim regex, od którego zacząć następny mecz.
Jak dotąd wiem, że istnieją 2 sposoby:
Użyj,
\ze
aby ustawić koniec meczu:Użyj pozytywnego lookahead,
\@=
który w Vimie nazywa się dopasowywaniem zerowej szerokości:Więc end-of-match „wskaźnik” rodzaj przewinięty do początku
^===* Diff
linii, tak żeregion Diff
nic niestart
zacznie jej dopasowanie w^===* Diff
znowu linii.źródło