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.php
avec 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 JAVASCRIPT
bloc est correctement mis en surbrillance, mais pas le CSS
bloc. De plus, si j'exécute SynStack
le var
mot 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?
la source
// This should be syntax-highlighted
n'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.Réponses:
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
contains
1 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:
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:
Le troisième match est ce commentaire:
Cela semble prometteur! Jetons un coup d'œil à la ligne de syntaxe appropriée:
( 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
@htmlJavascript
syntaxecluster
2 dans l'contains
argument.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'
start
expression régulière. Changez simplement lejavascript
encss
: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
htmljavascript
3 pour voir où cela est défini: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:
On dirait que ça pourrait être ça 4 .
Exécutez à nouveau la recherche dans ce fichier, et nous trouvons cette ligne 5 :
Donc htmlJavaScript est un
cluster
, défini danshtml.vim
. Existe-t-il un cluster similaire pour CSS que nous pouvons utiliser?Ouaip!
Il nous suffit donc de remplacer
@htmlJavascript
par@htmlCss
dans l'contains
argument:Et comment puis-je y ajouter?
Enregistrez l'intégralité de la commande de syntaxe ci-dessous dans le fichier
~/after/syntax/php.vim
afin qu'elle soit exécutée une fois le reste du traitement de syntaxe PHP terminé, et vous avez terminé!1: Voir
:help :syn-contains
pour plus de détails.2: Voir
:help :syn-cluster
.3: Je suis
'ignorecase'
allumé. Sans cela, vous devrez rechercherhtmlJavascript
ou\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
htmlJavascript
seul nom.5: Avec "JavaScript" en majuscule différemment, cette fois. Heureusement que nous sommes
'ignorecase'
allumés, hein?la source