括号内的颜色变量

时间:2015-06-27 07:51:39

标签: emacs elisp

我最近从vim转换为emacs并错过了shell脚本的一个关键功能:变量在双引号内突出显示。如何重新使用此功能?

我读了in another thread您可以使用syntax-ppss来检测引号的内部,但我该如何更改颜色?

请注意,应为name="$first $last"启用颜色,但不要name='$first $last'

1 个答案:

答案 0 :(得分:2)

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

下面的代码使用带有函数而不是正则表达式的字体锁定规则,函数搜索activerecord::schema.define(version: _____) do 的出现次数,但仅限于它们在双引号字符串中。函数$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)))))