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-daemon
von 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
prerotate
undpostrotate
als 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
/ \ze
oder Lookaheads / Lookbehinds) anstatt region
auch. Ich habe auch versucht, match
sowohl 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.
quelle
Antworten:
Nach einigem Experimentieren funktioniert Folgendes:
Zum einen bekommen
syntax
Set mit anderen kooperieren , das ist überlappen, können wir enthalten die engere Übereinstimmung innerhalb des breiteren Spiel.In diesem Fall:
contained
und 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.keepend
damit die Übereinstimmung für das Schlüsselwort die Übereinstimmung für das Ende der Region nicht verdeckt.In Kombination mit der Hervorhebung der Shell-Skriptsyntax von Vim:
Ich bekomme:
Beachten Sie, dass ich
re
undrs
anstelle vonms
/hs
,me
/ verwendet habehe
. 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:
In diesem Fall nutze ich
matchgroup
:Rückblickend
matchgroup
sollte genau dieses Problem gelöst werden. Wir müssen die begrenzenden Schlüsselwörter nicht separat auflisten, damatchgroug
wir die Trennzeichen separat hervorheben können.quelle
rs
/ms
Optionen.