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, $VAR
pero 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 prepend
bandera para agregarse encima del resaltado de cadena existente. (Tenga en cuenta que muchos paquetes se usan t
para esto. Desafortunadamente, esto sobrescribe todos los aspectos del resaltado existente. Por ejemplo, el uso prepend
retendrá 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.