我最近从vim转换为emacs并错过了shell脚本的一个关键功能:变量在双引号内突出显示。如何重新使用此功能?
我读了in another thread您可以使用syntax-ppss
来检测引号的内部,但我该如何更改颜色?
请注意,应为name="$first $last"
启用颜色,但不要name='$first $last'
答案 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)))))