在Emacs中,我想在emacs lisp中引用符号,例如:'blah
,并以不同的颜色显示它们。如何使用font-lock
模式执行此操作?
答案 0 :(得分:5)
尝试:
(font-lock-add-keywords 'emacs-lisp-mode
'(("'[-a-zA-Z_][-a-zA-Z0-9_]*\\>" 0 'font-lock-constant-face)))
或(如果您不希望报价上色):
(font-lock-add-keywords 'emacs-lisp-mode
'(("'\\([-a-zA-Z_][-a-zA-Z0-9_]*\\)\\>" 1 'font-lock-constant-face)))
这不会对注释或字符串中的内容进行着色,因为它们在前面是彩色的,而font-lock(默认情况下)不会重新着色。
答案 1 :(得分:1)
以下代码将为引号本身启用语法突出显示,并为其后面的符号启用不同的面。如果需要,您还可以自定义两个面。您可能还希望能够轻松地发现'(hello world)
和(hello world)
之间的差异。为此,突出显示引用可能是不够的,因此代码的注释部分用于突出引用后的左括号。它们被注释掉了因为我不认为它与其他突出显示不同颜色的嵌套括号的包兼容,并且您很可能正在使用其中一个包。
(defface my-lisp-quoted-symbol-face
'((t :inherit font-lock-constant-face))
"Face for Lisp quoted symbols.")
(defface my-lisp-quote-face
'((t :inherit warning))
"Face for Lisp quotes.")
;; (defface my-lisp-quoted-open-paren-face
;; '((t :weight bold
;; :inherit my-lisp-quoted-symbol-face))
;; "Face for Lisp quoted open paren.")
(defvar my--lisp-quote-regexp
(rx (group "'")
(or symbol-start
(group (syntax open-parenthesis)))))
(defvar my--lisp-quoted-symbol-regexp
(rx "'" (group (+ (or (syntax symbol)
(syntax word))))))
(dolist (mode (list 'emacs-lisp-mode
'lisp-mode))
(font-lock-add-keywords mode
`((,my--lisp-quote-regexp
(1 'my-lisp-quote-face)
;; (2 'my-lisp-quoted-open-paren-face nil t)
)
(,my--lisp-quoted-symbol-regexp
1 'my-lisp-quoted-symbol-face))))
defface和rx的使用使代码更加冗长。 defface的好处是容易定制面孔。当您尝试将此代码修改为其他用途时(例如,如果您想使其也处理反引号),则会产生rx的好处。)