Некоторое время назад я решил узнать больше о том, как работают файлы синтаксиса vim, создав свои собственные. Моя цель состояла в том, чтобы создать простой файл синтаксиса, который бы разделял файл на 3 части на основе разделителей и включал ранее существующие файлы синтаксиса для двух из этих трех частей.
Это пример файла:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
Цель состояла в том, чтобы применить git.vim
только к журналу и diff.vim
только к разнице, исключая два заголовка. 1 Вот как выглядит мой синтаксический файл:
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"
Обратите внимание, что end
в первом регионе так же, как start
во втором регионе. Это не работает; вторая область, по-видимому, не обнаружена и подсветка синтаксиса не применяется.
Я могу заставить его работать, ослабив регулярное выражение end=/^===/
и start=/=== Diff/
, чтобы регионы не соприкасались, но особенно не нравились - менее очевидно, что один должен начинаться там, где заканчивается другой.
Есть ли способ разрешить двум определениям областей касаться одних и тех же символов (и / или сделать соответствующие края исключительными, а не включающими), или я застрял с более слабым регулярным выражением?
1 (Да, я знаю, в том git.vim
числе diff.vim
, но это было учебное упражнение)
источник
:h :syn-pattern-offset
), Либо путем изменения области GitLog, чтобы она продолжалась до конца файла, и области Diff, чтобы быть полностью внутри области GitLog , Я не мог заставить ни один из этих методов работать, все же.Ответы:
Вы можете указать движку Vim regex, с чего начать следующий матч.
Пока я знаю, что есть 2 способа:
Используйте
\ze
для установки конца матча:Используйте положительный взгляд,
\@=
который называется сопоставлением нулевой ширины в Vim:Таким образом, с истекшим матча «указатель» вид перематывается на начало
^===* Diff
строки, например , чтоregion Diff
«sstart
начнет согласование на^===* Diff
линии снова.источник