3 Stimmen

Syntax-Hervorhebung von verschachtelten Kommentar-Faltungen in Vim

In Vim verwende ich die Standard-Faltmarkierungen {{{, }}} mit einer Benennungskonvention für die Folds (z.B. {{{ Sammlung). Einige benannte Folds definieren einen Kommentar (z.B. {{{ Dokumentation) und ich möchte, dass diese entsprechend hervorgehoben werden. Alle Folds enden mit demselben }}} Markierer.

Ich habe etwas Erfolg mit dem folgenden:

syn region cComment start="{{{ Dokumentation" end="}}}"
    contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold

aber das Problem ist, dass kommentierte Folds auch generische Sammlung Folds enthalten können, wie im folgenden Beispiel:

{{{ Dokumentation
    {{{ Sammlung
    // einiger Text
    }}}
    {{{ Sammlung
    // einiger Text
    }}}
}}}

In diesem Fall endet der Kommentar, wenn das erste }}} erreicht wird, sodass der zweite Sammlung Fold nicht als Kommentar hervorgehoben wird.

Die contains Option scheint nicht relevant zu sein, da dadurch enthaltene Folds ihre Standardhervorhebung haben.

Ich möchte, dass jeder Fold innerhalb eines Kommentar-Folds die Kommentarsyntax erbt, ohne ihre Standard-Syntax außerhalb eines Kommentar-Folds zu beeinflussen.

Ist das in Vim möglich, wenn alle Folds die gleichen Endmarkierungen haben?

4voto

1983 Punkte 5742
" Hallo. Zwei Syntax-Regionen reichen nicht aus, Sie müssen eine dritte verwenden. Es gibt zwei wichtige Dinge zu beachten. Erstens verhindert 'matchgroup' (siehe :help: syn-matchgroup) das Übereinstimmen von enthaltenen Elementen in den Start- und Endmustern des enthaltenden Elements. Zweitens ermöglicht 'transparent' (siehe: help: syn-transparent) das Vererben der Syntaxfärbung eines Elements.

" Speichern Sie diesen gesamten Text in einer Datei und führen Sie dann :source aus, um den Effekt zu sehen.

"   blah
"   {{{ collection
"       blah
"   }}}
"   blah
"   {{{ documentation
"       {{{ collection
"           blah
"       }}}
"       blah
"       {{{ collection
"           blah
"       }}}
"   }}}
"   blah
"   {{{ collection
"       // some text
"   }}}
"   blah

syn clear

hi documentation guifg=darkcyan ctermfg=darkcyan
hi collection guifg=darkmagenta ctermfg=darkmagenta

syn region genericdoc start="{{{" end="}}}" transparent
syn region collection start="{{{ collection" end="}}}"
syn region documentation matchgroup=documentation
\ start="{{{ documentation" end="}}}" contains=genericdoc

0 Stimmen

Ausgezeichnet! Die transparent Einstellung war genau das, was ich brauchte! Vielen Dank.

0voto

Herbert Sitz Punkte 21158

Ich bin ehrlich gesagt nicht ganz sicher, was du möchtest, aber es scheint eine Möglichkeit zu geben, zwischen dem Ende deines 'Dokumentations'-Abschnitts und dem Ende deiner 'Sammlungs'-Abschnitte zu unterscheiden. Der folgende Code beendet den cComment-Bereich nur dann, wenn drei rechte Klammern als erste Zeichen in einer Zeile gefunden werden:

syn region cComment start="{{{ documentation" end="^}}}"
    contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold

Außerdem ist die 'fold'-Option in deinem Syntax-Regions-Befehl nicht relevant, wenn du Marker verwendest, um Faltungen anzugeben. Die Verwendung von 'fold' mit syn-region ist nur nützlich, wenn du Syntax zum Festlegen von Faltungen verwendest, was du nicht tust.

0 Stimmen

Vielen Dank für deinen Vorschlag. Er würde im Beispiel, das ich gegeben habe, definitiv funktionieren, aber ich möchte nicht von der Einrückungsebene der verschachtelten Folds abhängig sein. Die enthalten Option ist fast das, was ich will - sie erlaubt Vim, die End-Fold-Marker der abgeglichenen Folds innerhalb des Dokumentationsfolds zu ignorieren, aber dann sind sie nicht mehr kommentiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X