Тому я деякий час вирішив дізнатися більше про те, як працюють синтаксичні файли 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 . Хоча я не міг змусити жоден із цих методів працювати.