O código abaixo usa uma regra de bloqueio de fonte com uma função em vez de uma regexp, a função procura por ocorrências, $VAR
mas somente quando elas estão dentro de uma cadeia de caracteres entre aspas duplas. A função (syntax-ppss)
é usada para determinar isso.
A regra de bloqueio de fonte usa o prepend
sinalizador para adicionar-se sobre o realce de string existente. (Observe que muitos pacotes usam t
isso. Infelizmente, isso substitui todos os aspectos do realce existente. Por exemplo, o uso prepend
reterá uma cor de fundo da string (se houver) ao substituir a cor do primeiro 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)))))
Você pode chamar usar isso adicionando a última função a um gancho adequado, por exemplo:
(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)
sh-mode
? Talvez ele possa ser adicionado ao próprio Emacs.