El siguiente código utiliza una regla de bloqueo de fuente con una función en lugar de una expresión regular, la función busca ocurrencias de, $VARpero solo cuando están dentro de una cadena entre comillas dobles. La función (syntax-ppss)se usa para determinar esto.
La regla de bloqueo de fuente usa la prependbandera para agregarse encima del resaltado de cadena existente. (Tenga en cuenta que muchos paquetes se usan tpara esto. Desafortunadamente, esto sobrescribe todos los aspectos del resaltado existente. Por ejemplo, el uso prependretendrá un color de fondo de cadena (si lo hay) mientras reemplaza el color de primer plano).
(defun sh-script-extra-font-lock-is-in-double-quoted-string ()
"Non-nil if point in inside a double-quoted string."
(let ((state (syntax-ppss)))
(eq (nth 3 state) ?\")))
(defun sh-script-extra-font-lock-match-var-in-double-quoted-string (limit)
"Search for variables in double-quoted strings."
(let (res)
(while
(and (setq res
(re-search-forward
"\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)"
limit t))
(not (sh-script-extra-font-lock-is-in-double-quoted-string))))
res))
(defvar sh-script-extra-font-lock-keywords
'((sh-script-extra-font-lock-match-var-in-double-quoted-string
(2 font-lock-variable-name-face prepend))))
(defun sh-script-extra-font-lock-activate ()
(interactive)
(font-lock-add-keywords nil sh-script-extra-font-lock-keywords)
(if (fboundp 'font-lock-flush)
(font-lock-flush)
(when font-lock-mode
(with-no-warnings
(font-lock-fontify-buffer)))))
Puede llamar a usar esto agregando la última función a un enlace adecuado, por ejemplo:
(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)
sh-mode? Tal vez se pueda agregar a Emacs.