Dans vim, le document suivant provoquera la $PWD
couleur des lignes 2 et 3 de deux manières différentes:
#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'
La première instance de $PWD
sera dans une couleur différente du reste de la chaîne dans laquelle elle se trouve. Cela donne une indication visuelle claire que la variable sera développée, plutôt que traitée comme du texte littéral. En revanche, la deuxième instance de $PWD
sera colorée de la même manière que le reste de la chaîne, car les guillemets simples la traitent comme du texte littéral.
Existe-t-il des modes emacs existants qui fournissent ce type de "reconnaissance de citations de shell"?
sh-mode
? Peut-être qu'il peut être ajouté à Emacs lui-même.Réponses:
Le code ci-dessous utilise une règle de verrouillage de police avec une fonction au lieu d'une expression rationnelle, la fonction recherche les occurrences de
$VAR
mais uniquement lorsqu'elles se trouvent à l'intérieur d'une chaîne entre guillemets doubles. La fonction(syntax-ppss)
est utilisée pour déterminer cela.La règle de verrouillage de police utilise l'
prepend
indicateur pour s'ajouter au-dessus de la surbrillance de chaîne existante. (Notez que de nombreux packages l'utilisentt
. Malheureusement, cela écrase tous les aspects de la mise en surbrillance existante. Par exemple, l'utilisationprepend
conservera une couleur d'arrière-plan de chaîne (s'il y en a une) tout en remplaçant la couleur de premier plan.)Vous pouvez appeler use this en ajoutant la dernière fonction à un hook approprié, par exemple:
la source
2
dans la règle de verrouillage des polices par un,0
cela devrait fonctionner. (Vous devrez peut-être étendre l'expression régulière pour inclure une fin}
pour surligner${FOO}
correctement.) Ce nombre fait référence au sous-groupe d'expression régulière de la correspondance,0
ce qui signifie que la correspondance entière doit être mise en surbrillance.J'ai amélioré la réponse de @ Lindydancer de la manière suivante:
sh-script-extra-font-lock-is-in-double-quoted-string
fonction, car elle n'a été utilisée qu'une seule fois$10
,$1
, etc.) sont mis en évidence.Pause pour le code
la source
[^\\\\]
pourrait être écrit comme[^\\]
, c'est un ensemble de caractères qui ne doivent pas être mis en correspondance, et votre code comprend deux barres obliques inverses. Dans les anciennes versions d'Emacs doivent être utiliséesfont-lock-fontify-buffer
, dans les plus récentes, vous êtes censé appelerfont-lock-flush
et appelerfont-lock-fontify-buffer
depuis elisp est déconseillé. Mon code d'origine a suivi cela, pas votre code. Quoi qu'il en soit, il pourrait être préférable de migrer cela vers une archive GitHub et de rejoindre l'effort.[^\\]
au]
? Voilà comment fonctionne regex en Java, comme je le sais.