Come posso abilitare la sintassi specifica della lingua all'interno di una eredità?


19

Quando modifico un file PHP e definisco una stringa in un heredoc, l'evidenziazione della sintassi verrà abilitata all'interno dell'ereditarietà se si tratta di sintassi JavaScript o sintassi HTML o sintassi SQL. Tuttavia non funzionerà per la sintassi CSS.

Esempio (se creiamo un nuovo file PHP chiamato hello.phpcon il seguente codice):

<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;

Il JAVASCRIPTblocco è evidenziato correttamente, ma il CSSblocco no. Inoltre, se eseguo SynStackla varparola chiave sul blocco di codice JavaScript, ottengo ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], ma se faccio lo stesso in qualsiasi posizione nel blocco CSS, ottengo solo ['phpRegion', 'phpHereDoc'], quindi ho bisogno di aggiungere alcune regole di evidenziazione della sintassi CSS. Dove vengono definite queste regole di sintassi e come posso aggiungerle?


1
Nota: // This should be syntax-highlightednon è un commento CSS valido e quindi dovrebbe essere evidenziata la sintassi come qualcosa di diverso da un commento. CSS supporta solo /* */commenti su più righe. //i commenti a riga singola sono supportati solo se si utilizzano lingue preprocessore come Sass o Stilo.
Rory O'Kane,

Hai ragione. Ho aggiornato il codice per riflettere quel cambiamento.
MrSnrub,

Anch'io sto cercando una soluzione per l'evidenziazione della sintassi ereditaria CSS. Ho provato molti scenari ma non sono riuscito a farlo funzionare. Qualcuno ha una soluzione?
Ken,

Risposte:


3

TL; DR:

È definito nei file di sintassi PHP e HTML di Vim. Per vedere come aggiungere regole per CSS, vai alla sezione E come posso aggiungerle? di seguito o continua a leggere per una spiegazione di come funziona.

Dove vengono definite queste regole di sintassi?

L'eredità JavaScript viene evidenziata utilizzando la funzione di sintassi contains1 di Vim , che consente ai gruppi di sintassi di contenere altri gruppi di sintassi.

Per trovare dove è definito, apri prima il file di evidenziazione della sintassi per PHP:

:e $VIMRUNTIME/syntax/php.vim

Ora, presumibilmente, il file di sintassi sta trovando l'ereditarietà JavaScript basato su una corrispondenza della stringa "javascript", quindi proviamo a cercarlo:

/javascript

La terza partita è questo commento:

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

Sembra promettente! Diamo un'occhiata alla riga di sintassi pertinente:

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

( continuazioni di riga aggiunte per una lettura più semplice )

Okay, allora questa regione sintassi trova il heredoc JavaScript con un'espressione regolare contorto, e permette JavaScript evidenziando all'interno della regione includendo la @htmlJavascriptsintassi cluster2 all'interno della containsdiscussione.

Ma non esiste una definizione corrispondente per gli heredocs CSS! Aggiungiamo uno. Quindi la prima cosa da cambiare è l' startespressione regolare. Cambia semplicemente javascriptin css:

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

Questo è facile!

Ma non vogliamo evidenziare JavaScript nella nostra eredità CSS. Quindi dobbiamo anche cambiare l' @htmlJavascriptequivalente CSS. Ma qual è l'equivalente CSS? (Potresti essere in grado di indovinare, ma esaminiamo i movimenti per essere sicuri.)

Consente di cercare htmljavascript3 per vedere dove è definito:

/htmljavascript

Hmmm. Nessun altro risultato Deve essere definito altrove! Diamo una rapida occhiata nella parte superiore del file per vedere se possiamo trovare eventuali include:

runtime! syntax/html.vim

Sembra che potrebbe essere 4 .

:e $VIMRUNTIME/syntax/html.vim

Esegui nuovamente la ricerca in questo file e troviamo questa riga 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

Quindi htmlJavaScript è un cluster, definito in html.vim. Esiste un cluster simile per CSS che possiamo usare?

/htmlcss

Sì!

syn include @htmlCss syntax/css.vim

Quindi dobbiamo solo sostituire @htmlJavascriptcon @htmlCssl' containsargomento:

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

E come posso aggiungerli?

Salvare l'intero comando di sintassi di seguito nel file in ~/after/syntax/php.vimmodo che venga eseguito dopo che il resto dell'elaborazione della sintassi PHP è stato eseguito e il gioco è fatto!

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: vedi :help :syn-containsper i dettagli.
2: Vedi :help :syn-cluster.
3: ho 'ignorecase'acceso. Senza di esso, dovrai cercare htmlJavascripto \chtmljavascript
4: infatti, in base allo schema di denominazione utilizzato nei file di sintassi di Vim, probabilmente avremmo potuto capirlo in base al htmlJavascriptsolo nome.
5: Con "JavaScript" maiuscolo, questa volta. Fortunatamente ci siamo 'ignorecase'accesi, eh?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.