Überlappung von Syntax-Hervorhebungsbereich / Schlüsselwort

7

Ich versuche, eine Syntaxdatei für Linux-Logrotate-Skripte zu schreiben.

Oft enthalten sie Inline-Definitionen von Skripten, die vor oder nach der Rotationsaktion ausgeführt werden sollen.

Ein Beispiel (das cups-daemonvon Ubuntu 14.04 bereitgestellte Logrotate-Skript):

    prerotate
            if [ -e /var/run/cups/cupsd.pid ]; then
                    invoke-rc.d --quiet cups stop > /dev/null
                    touch /var/run/cups/cupsd.stopped
            fi
    endscript
    postrotate
            if [ -e /var/run/cups/cupsd.stopped ]; then
                    rm /var/run/cups/cupsd.stopped
                    invoke-rc.d --quiet cups start > /dev/null
                    sleep 10
            fi
    endscript

Gibt es einen Weg zu beiden:

  • markieren prerotateund postrotateals Schlüsselwörter, und
  • Alles dazwischen als Region hervorheben?

Ich kann die richtige Hervorhebung für beide definieren, aber es scheint nicht für beide.

" this works
syntax keyword LogrotateKeyword prerotate postrotate endscript

" this also works
syntax region LogrotateScript start=/prerotate/ms=e+1 end=/endscript/me=s-1

Jetzt werden beide in derselben Syntaxdatei unabhängig von der verwendeten Regelreihenfolge nur für Schlüsselwörter hervorgehoben.

Ich habe es versucht match(mit \zs/ \zeoder Lookaheads / Lookbehinds) anstatt regionauch. Ich habe auch versucht, matchsowohl für die Schlüsselwörter als auch für Inline-Skripte zu verwenden, in der Hoffnung, dass sich die Definitionen dadurch nicht überschneiden. Die Ergebnisse scheinen genau gleich zu sein.

Ich behalte möglicherweise die Standardfarbe für das Inline-Skript bei, aber anscheinend enthält das Inline-Material häufig andere logrotate-Schlüsselwörter, was verwirrend sein kann.

Höchstwahrscheinlich irrelevant für dieses Problem: Vim 7.4 mit den Patches 1-1529 (pi-rho PPA) und Ubuntu 14.04.

Łukasz Górski
quelle
Wenn Sie die logrotate-Syntaxdatei jemals fertiggestellt haben, teilen Sie sie bitte mit. Es wäre schön zu haben.
Muru
@muru Hier ist es. Vielen Dank für Ihre ausgezeichnete Antwort :)
Łukasz Górski

Antworten:

5

Nach einigem Experimentieren funktioniert Folgendes:

syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword

Zum einen bekommen syntaxSet mit anderen kooperieren , das ist überlappen, können wir enthalten die engere Übereinstimmung innerhalb des breiteren Spiel.

In diesem Fall:

  • Ich markiere die Schlüsselwörter als containedund die Region als die Schlüsselwörter enthaltend. Das Markieren der Schlüsselwörter ist nicht erforderlich, wird jedoch in Anbetracht der Art dieser Schlüsselwörter im gültigen Fall immer von dieser Region begleitet.
  • Ich musste verwenden, keependdamit die Übereinstimmung für das Schlüsselwort die Übereinstimmung für das Ende der Region nicht verdeckt.
  • Ich habe die breiteren regulären Ausdrücke ausgewählt, die die gesamte Linie abdecken, damit sich die Hervorhebung nicht auf diese Linien erstreckt (oder wenn Sie einen farbigen Hintergrund festlegen, sieht es sehr seltsam aus).

In Kombination mit der Hervorhebung der Shell-Skriptsyntax von Vim:

syntax include @sh syntax/sh.vim
syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword,@sh
highlight LogrotateKeyword ctermfg=yellow 

Ich bekomme:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass ich reund rsanstelle von ms/ hs, me/ verwendet habe he. Bei den anderen Optionen hat das Kombinieren der Schlüsselwörter mit der Shell-Skriptsyntax nicht funktioniert, obwohl ich nicht weiß, warum.


Folgendes wäre besser:

syntax region LogrotateScript matchgroup=LogrotateKeyword start=/\v(pre|post)rotate/ end=/endscript/ contains=@sh

In diesem Fall nutze ich matchgroup:

                                                        :syn-matchgroup
        "matchgroup" can be used to highlight the start and/or end pattern
        differently than the body of the region.  Example: 
  :syntax region String matchgroup=Quote start=+"+  skip=+\\"+  end=+"+
       This will highlight the quotes with the "Quote" group, and the text in
        between with the "String" group.

Rückblickend matchgroupsollte genau dieses Problem gelöst werden. Wir müssen die begrenzenden Schlüsselwörter nicht separat auflisten, da matchgrougwir die Trennzeichen separat hervorheben können.

muru
quelle
Hier ist ein kleines Diagramm für die erlaubten rs/ msOptionen.
Michael - Wo ist Clay Shirky