Wie aktiviere ich die sprachspezifische Syntax in einem Heredoc?

19

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.phpmit 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 JAVASCRIPTBlock ist korrekt markiert, der CSSBlock jedoch nicht. Auch wenn ich SynStackdas varSchlü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?

MrSnrub
quelle
1
Hinweis: Dies // This should be syntax-highlightedist 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.
Rory O'Kane
Du hast Recht. Ich habe den Code aktualisiert, um diese Änderung widerzuspiegeln.
MrSnrub
Ich bin auch auf der Suche nach einer Lösung für die Hervorhebung der CSS-Heredoc-Syntax. Ich habe viele Szenarien ausprobiert, konnte sie aber nicht zum Laufen bringen. Hat jemand eine Lösung?
Ken

Antworten:

3

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 contains1- 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:

:e $VIMRUNTIME/syntax/php.vim

Nun, vermutlich findet die Syntaxdatei den JavaScript-Heredoc basierend auf einer Übereinstimmung der Zeichenfolge "Javascript". Versuchen wir also, danach zu suchen:

/javascript

Das dritte Match ist dieser Kommentar:

" including HTML,JavaScript,SQL even if not enabled via options

Sieht vielversprechend aus! Werfen wir einen Blick auf die relevante Syntaxzeile:

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

( 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 @htmlJavascriptSyntax cluster2 in das containsArgument eingeschlossen wird.

Es gibt jedoch keine entsprechende Definition für CSS-Heredocs! Fügen wir eins hinzu. Das Erste, was sich ändert, ist der startreguläre Ausdruck. Ändern Sie einfach das javascriptin css:

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"

Das ist einfach!

Wir möchten jedoch keine JavaScript-Hervorhebung in unserem CSS-Heredoc. Daher müssen wir auch @htmlJavascriptdas 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 htmljavascript3 suchen, um zu sehen, wo das definiert ist:

/htmljavascript

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:

runtime! syntax/html.vim

Das sieht so aus, als könnte es 4 sein .

:e $VIMRUNTIME/syntax/html.vim

Führen Sie die Suche in dieser Datei erneut aus und wir finden die folgende Zeile 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

HtmlJavaScript ist also ein cluster, in html.vim. Gibt es einen ähnlichen Cluster für CSS, den wir verwenden können?

/htmlcss

Jep!

syn include @htmlCss syntax/css.vim

Also müssen wir im Argument nur ersetzen @htmlJavascriptdurch :@htmlCsscontains

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]

Und wie füge ich ihnen hinzu?

Speichern Sie den gesamten folgenden Syntaxbefehl in der Datei, ~/after/syntax/php.vimdamit er ausgeführt wird, nachdem der Rest der PHP-Syntaxverarbeitung ausgeführt wurde, und Sie sind fertig!

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlCss,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

1: Siehe :help :syn-containsfür Details.
2: Siehe :help :syn-cluster.
3: Ich habe 'ignorecase'eingeschaltet. Ohne sie müssen Sie nach htmlJavascriptoder \chtmljavascript
4 suchen : Basierend auf dem in Vim-Syntaxdateien verwendeten Benennungsschema hätten wir dies wahrscheinlich htmlJavascriptallein anhand des Namens herausfinden können.
5: Mit "JavaScript" diesmal anders groß geschrieben. 'ignorecase'Zum Glück haben wir uns eingeschaltet, was?

Reich
quelle