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.