括号内的颜色变量
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)
我最近从 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)