Wenn ich eine PHP-Datei bearbeite und eine Zeichenfolge in einem Heredoc definiere, wird die Syntaxhervorhebung im Heredoc aktiviert, wenn es sich um JavaScript-Syntax oder HTML-Syntax oder SQL-Syntax handelt. Für die CSS-Syntax funktioniert dies jedoch nicht.
Beispiel (wenn wir eine neue PHP-Datei hello.php
mit dem folgenden Code erstellen):
<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;
$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
font-weight: bold;
}
CSS;
Der JAVASCRIPT
Block ist korrekt markiert, der CSS
Block jedoch nicht. Auch wenn ich SynStack
das var
Schlüsselwort im JavaScript-Codeblock ausführe, erhalte ich ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier']
, aber wenn ich dasselbe an einer beliebigen Stelle im CSS-Block mache, erhalte ich nur ['phpRegion', 'phpHereDoc']
, also muss ich einige Regeln für die Hervorhebung der CSS-Syntax hinzufügen. Wo werden diese Syntaxregeln definiert und wie füge ich sie hinzu?
quelle
// This should be syntax-highlighted
ist kein gültiger CSS-Kommentar. Daher sollte die Syntax als etwas anderes als ein Kommentar hervorgehoben werden. CSS unterstützt nur/* */
mehrzeilige Kommentare.//
Einzeilige Kommentare werden nur unterstützt, wenn Sie Präprozessorsprachen wie Sass oder Stylus verwenden.Antworten:
TL; DR:
Es ist in den PHP- und HTML-Syntaxdateien von Vim definiert. Um zu sehen, wie Regeln für CSS hinzugefügt werden, springen Sie zum Abschnitt. Und wie füge ich sie hinzu? weiter unten oder lesen Sie weiter, um eine Erklärung zu erhalten, wie es funktioniert.
Wo werden diese Syntaxregeln definiert?
Das JavaScript-Heredoc wird mithilfe der Syntax
contains
1- Funktion von Vim hervorgehoben, mit der Syntaxgruppen andere Syntaxgruppen enthalten können.Um herauszufinden, wo dies definiert ist, öffnen Sie zuerst die Syntax-Hervorhebungsdatei für PHP:
Nun, vermutlich findet die Syntaxdatei den JavaScript-Heredoc basierend auf einer Übereinstimmung der Zeichenfolge "Javascript". Versuchen wir also, danach zu suchen:
Das dritte Match ist dieser Kommentar:
Sieht vielversprechend aus! Werfen wir einen Blick auf die relevante Syntaxzeile:
( Zeilenfortsetzungen zum leichteren Lesen hinzugefügt )
Okay, diese Syntaxregion findet das JavaScript-Heredoc mit einem gewundenen regulären Ausdruck und ermöglicht das Hervorheben von JavaScript innerhalb der Region, indem die
@htmlJavascript
Syntaxcluster
2 in dascontains
Argument eingeschlossen wird.Es gibt jedoch keine entsprechende Definition für CSS-Heredocs! Fügen wir eins hinzu. Das Erste, was sich ändert, ist der
start
reguläre Ausdruck. Ändern Sie einfach dasjavascript
incss
:Das ist einfach!
Wir möchten jedoch keine JavaScript-Hervorhebung in unserem CSS-Heredoc. Daher müssen wir auch
@htmlJavascript
das CSS-Äquivalent ändern . Aber was ist das CSS-Äquivalent? (Vielleicht können Sie es erraten, aber lassen Sie uns die Bewegungen durchgehen, um sicherzugehen.)Lass uns nach
htmljavascript
3 suchen, um zu sehen, wo das definiert ist:Hmmm. Keine weiteren Ergebnisse. Es muss an anderer Stelle definiert werden! Werfen wir einen kurzen Blick auf den oberen Teil der Datei, um festzustellen, ob wir irgendwelche Includes finden können:
Das sieht so aus, als könnte es 4 sein .
Führen Sie die Suche in dieser Datei erneut aus und wir finden die folgende Zeile 5 :
HtmlJavaScript ist also ein
cluster
, inhtml.vim
. Gibt es einen ähnlichen Cluster für CSS, den wir verwenden können?Jep!
Also müssen wir im Argument nur ersetzen
@htmlJavascript
durch :@htmlCss
contains
Und wie füge ich ihnen hinzu?
Speichern Sie den gesamten folgenden Syntaxbefehl in der Datei,
~/after/syntax/php.vim
damit er ausgeführt wird, nachdem der Rest der PHP-Syntaxverarbeitung ausgeführt wurde, und Sie sind fertig!1: Siehe
:help :syn-contains
für Details.2: Siehe
:help :syn-cluster
.3: Ich habe
'ignorecase'
eingeschaltet. Ohne sie müssen Sie nachhtmlJavascript
oder\chtmljavascript
4 suchen : Basierend auf dem in Vim-Syntaxdateien verwendeten Benennungsschema hätten wir dies wahrscheinlich
htmlJavascript
allein anhand des Namens herausfinden können.5: Mit "JavaScript" diesmal anders groß geschrieben.
'ignorecase'
Zum Glück haben wir uns eingeschaltet, was?quelle