Comment activer la syntaxe spécifique à la langue dans un hérédoc?

19

Lorsque je modifie un fichier PHP et que je définis une chaîne dans un hérédoc, la coloration syntaxique sera activée à l'intérieur de l'hérédoc s'il s'agit de la syntaxe JavaScript ou HTML ou SQL. Cependant, cela ne fonctionnera pas pour la syntaxe CSS.

Exemple (si nous créons un nouveau fichier PHP appelé hello.phpavec le code suivant):

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

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

Le JAVASCRIPTbloc est correctement mis en surbrillance, mais pas le CSSbloc. De plus, si j'exécute SynStackle varmot clé sur le bloc de code JavaScript, j'obtiens ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], mais si je fais la même chose à n'importe quel endroit dans le bloc CSS, j'obtiens uniquement ['phpRegion', 'phpHereDoc'], donc je dois ajouter des règles de mise en évidence de la syntaxe CSS. Où sont définies ces règles de syntaxe et comment les ajouter?

MrSnrub
la source
1
Remarque: // This should be syntax-highlightedn'est pas un commentaire CSS valide, et la syntaxe doit donc être mise en surbrillance comme autre chose qu'un commentaire. CSS ne prend en charge que /* */les commentaires sur plusieurs lignes. //les commentaires sur une seule ligne ne sont pris en charge que si vous utilisez des langages de préprocesseur tels que Sass ou Stylus.
Rory O'Kane
Vous avez raison. J'ai mis à jour le code pour refléter ce changement.
MrSnrub
Je cherche moi aussi une solution pour la mise en évidence de la syntaxe CSS hérédoc. J'ai essayé de nombreux scénarios mais je n'ai pas pu le faire fonctionner. Quelqu'un a une solution?
Ken

Réponses:

3

TL; DR:

Il est défini dans les fichiers de syntaxe PHP et HTML de Vim. Pour voir comment ajouter des règles CSS, passez à la section Et comment les ajouter? ci-dessous, ou lisez la suite pour une explication de son fonctionnement.

Où ces règles de syntaxe sont-elles définies?

L'hérédoc JavaScript est mis en évidence à l'aide de la fonction de syntaxe contains1 de Vim , qui permet aux groupes de syntaxe de contenir d'autres groupes de syntaxe.

Pour trouver où cela est défini, ouvrez d'abord le fichier de coloration syntaxique pour PHP:

:e $VIMRUNTIME/syntax/php.vim

Maintenant, on peut supposer que le fichier de syntaxe trouve l'hérédoc JavaScript basé sur une correspondance de la chaîne "javascript", alors essayons de le rechercher:

/javascript

Le troisième match est ce commentaire:

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

Cela semble prometteur! Jetons un coup d'œil à la ligne de syntaxe appropriée:

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

( ajout de continuations de ligne pour une lecture plus facile )

D'accord, cette région de syntaxe trouve donc l'hérédoc JavaScript avec une expression régulière alambiquée et permet la mise en évidence de JavaScript dans la région en incluant la @htmlJavascriptsyntaxe cluster2 dans l' containsargument.

Mais il n'y a pas de définition correspondante pour les heredocs CSS! Permet d'en ajouter un. La première chose à changer est donc l' startexpression régulière. Changez simplement le javascripten css:

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

C'est facile!

Mais nous ne voulons pas que JavaScript soit mis en évidence dans notre hérédoc CSS. Nous devons donc également modifier l' @htmlJavascriptéquivalent CSS. Mais qu'est - ce que l'équivalent CSS? (Vous pourriez peut-être deviner, mais passons en revue les motions pour en être sûr.)

Permet de rechercher htmljavascript3 pour voir où cela est défini:

/htmljavascript

Hmmm. Aucun autre résultat. Il faut le définir ailleurs! Jetons un coup d'œil en haut du fichier pour voir si nous pouvons trouver des inclusions:

runtime! syntax/html.vim

On dirait que ça pourrait être ça 4 .

:e $VIMRUNTIME/syntax/html.vim

Exécutez à nouveau la recherche dans ce fichier, et nous trouvons cette ligne 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

Donc htmlJavaScript est un cluster, défini dans html.vim. Existe-t-il un cluster similaire pour CSS que nous pouvons utiliser?

/htmlcss

Ouaip!

syn include @htmlCss syntax/css.vim

Il nous suffit donc de remplacer @htmlJavascriptpar @htmlCssdans l' containsargument:

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

Et comment puis-je y ajouter?

Enregistrez l'intégralité de la commande de syntaxe ci-dessous dans le fichier ~/after/syntax/php.vimafin qu'elle soit exécutée une fois le reste du traitement de syntaxe PHP terminé, et vous avez terminé!

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: Voir :help :syn-containspour plus de détails.
2: Voir :help :syn-cluster.
3: Je suis 'ignorecase'allumé. Sans cela, vous devrez rechercher htmlJavascriptou \chtmljavascript
4: En fait, sur la base du schéma de dénomination utilisé dans les fichiers de syntaxe Vim, nous aurions probablement pu comprendre cela en fonction du htmlJavascriptseul nom.
5: Avec "JavaScript" en majuscule différemment, cette fois. Heureusement que nous sommes 'ignorecase'allumés, hein?

Riches
la source