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:
: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 @htmlJavascript
Syntax cluster
2 in das contains
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 das javascript
in 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 @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:
/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 @htmlJavascript
durch :@htmlCss
contains
contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]
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!
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-contains
für Details.
2: Siehe :help :syn-cluster
.
3: Ich habe 'ignorecase'
eingeschaltet. Ohne sie müssen Sie nach htmlJavascript
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?
// 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.