In vim bewirkt das folgende Dokument, dass die $PWD
Zeilen 2 und 3 auf zwei verschiedene Arten gefärbt werden:
#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'
Die erste Instanz von hat $PWD
eine andere Farbe als der Rest der Zeichenfolge, in der sie sich befindet. Dies gibt einen klaren visuellen Hinweis darauf, dass die Variable erweitert wird, anstatt als wörtlicher Text behandelt zu werden. Im Gegensatz dazu wird die zweite Instanz von $PWD
genauso gefärbt wie der Rest der Zeichenfolge, da sie durch einfache Anführungszeichen als wörtlicher Text behandelt wird.
Gibt es irgendwelche Emacs-Modi, die diese Art von "Shell-Quoting-Awareness" bieten?
sh-mode
? Vielleicht kann es zu Emacs selbst hinzugefügt werden.Antworten:
Der folgende Code verwendet eine Schriftsperrregel mit einer Funktion anstelle eines regulären Ausdrucks, wobei die Funktion
$VAR
nur dann nach Vorkommen sucht, wenn sie sich in einer Zeichenfolge in doppelten Anführungszeichen befinden. Die Funktion(syntax-ppss)
wird verwendet, um dies zu bestimmen.Die Schriftsperrregel verwendet das
prepend
Flag, um sich über die vorhandene Zeichenfolgenhervorhebung zu setzen. (Beachten Sie, dass dies in vielen Paketen verwendett
wird. Leider werden dadurch alle Aspekte der vorhandenen Hervorhebung überschrieben. Wenn Sie beispielsweise verwenden,prepend
wird eine Zeichenfolgenhintergrundfarbe beibehalten (sofern vorhanden), während die Vordergrundfarbe ersetzt wird.)Sie können use this aufrufen, indem Sie die letzte Funktion einem geeigneten Hook hinzufügen, zum Beispiel:
quelle
2
in der Schriftsperre enthaltene Regel durch eine ersetzen0
, sollte dies funktionieren. (Möglicherweise müssen Sie den regulären Ausdruck so erweitern, dass er einen abschließenden Text enthält}
, damit er${FOO}
richtig hervorgehoben wird.) Diese Zahl bezieht sich auf die reguläre Ausdruck-Untergruppe der Übereinstimmung, dh0
, die gesamte Übereinstimmung sollte hervorgehoben werden.Ich habe die Antwort von @ Lindydancer folgendermaßen verbessert:
sh-script-extra-font-lock-is-in-double-quoted-string
Funktion, da sie nur einmal verwendet wurde$10
,$1
usw.) werden hervorgehoben.Pause für Code
quelle
[^\\\\]
könnte so geschrieben werden[^\\]
, es ist ein Satz von Zeichen, die nicht übereinstimmen sollten, und Ihr Code enthält zweimal einen Backslash. In älteren Emacs-Versionen muss man verwendenfont-lock-fontify-buffer
, in neueren soll man anrufenfont-lock-flush
undfont-lock-fontify-buffer
aus elisp anrufen ist veraltet. Mein ursprünglicher Code folgte diesem, Ihr Code nicht. Auf jeden Fall ist es möglicherweise eine bessere Idee, dies in ein GitHub-Archiv zu migrieren und sich den Bemühungen anzuschließen.[^\\]
die entkommen]
? So funktioniert Regex in Java, wie ich weiß.