Vor einiger Zeit hatte ich mich entschlossen, mehr über die Funktionsweise von vims Syntaxdateien zu erfahren, indem ich meine eigenen erstellte. Mein Ziel war es, eine einfache Syntaxdatei zu erstellen, die die Datei basierend auf Trennzeichen in drei Teile aufteilt und bereits vorhandene Syntaxdateien für zwei dieser drei Teile enthält.
Dies ist eine Beispieldatei:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
Das Ziel bestand darin git.vim
, nur das Protokoll und diff.vim
nur den Unterschied zu berücksichtigen, ohne die beiden Header. 1 So sah meine Syntaxdatei aus:
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"
Beachten Sie, dass end
die erste Region start
mit der zweiten Region identisch ist. Das funktioniert nicht. Der zweite Bereich wird anscheinend nicht erkannt und die Syntaxhervorhebung wird nicht angewendet.
Ich kann es schaffen, indem ich den regulären Ausdruck auf end=/^===/
und löse start=/=== Diff/
, damit sich die Regionen nicht berühren, aber nicht besonders mögen - es ist weniger offensichtlich, dass man dort beginnen soll, wo der andere endet.
Gibt es eine Möglichkeit, zuzulassen, dass zwei Regionsdefinitionen die gleichen Zeichen berühren (und / oder die übereinstimmenden Kanten exklusiv statt inklusiv machen), oder bin ich mit dem loseren regulären Ausdruck festgefahren?
1 (Ja, ich weiß, git.vim
beinhaltet diff.vim
, aber dies war eine Lernübung)
quelle
:h :syn-pattern-offset
Regionsende " verwendet wird, um die Kanten exklusiv zu machen (siehe ), oder indem die GitLog-Region so geändert wird, dass sie sich bis zum Ende der Datei erstreckt, und die Diff-Region vollständig innerhalb der GitLog-Region liegt . Ich konnte jedoch keine dieser Methoden zum Laufen bringen.Antworten:
Sie können der Vim Regex-Engine mitteilen, wo sie das nächste Spiel starten soll.
Soweit ich weiß, gibt es zwei Möglichkeiten:
Verwenden Sie
\ze
diese Option , um das Ende eines Matches festzulegen:Verwenden Sie den positiven Lookahead,
\@=
der in Vim als Null-Breiten-Matching bezeichnet wird:So ist die End-of-match „Zeiger“ Art von spult an den Anfang der
^===* Diff
Linie, so dassregion Diff
‚sstart
seine Anpassung an beginnen^===* Diff
Linie wieder.quelle