括号内的颜色变量

Color variables inside parenthesis

我最近从 vim 过渡到 emacs,但错过了 shell 脚本编写的一个关键功能:变量在双引号内突出显示。如何恢复此功能?

我读到 in another thread 可以使用 syntax-ppss 来检测引号内部,但我实际上如何更改颜色?

请注意,应为 name="$first $last" 打开颜色,但不为 name='$first $last'

有趣的是,就在几天前,asked and answered 在 emacs.stackexchange.com 中提出了这个问题:

下面的代码使用一个函数而不是正则表达式的字体锁定规则,该函数搜索出现的 $VAR 但仅当它们在双引号字符串中时。函数(syntax-ppss)就是用来判断这个的。

字体锁定规则使用 prepend 标志将自身添加到现有字符串突出显示的顶部。 (请注意,许多包为此使用 t。不幸的是,这会覆盖现有突出显示的所有方面。例如,使用 prepend 将在替换前景时保留字符串背景颜色(如果有的话)颜色。)

(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)))))

您可以通过将最后一个函数添加到合适的钩子来调用 use this,例如:

(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)