【发布时间】:2012-12-17 04:15:06
【问题描述】:
在 Emacs 中,我希望在 emacs lisp 中引用符号,例如:'blah,并以不同的颜色显示它们。如何使用font-lock 模式来做到这一点?
【问题讨论】:
-
@wvxvw 感谢您的反馈。我编辑了问题。
标签: emacs lisp elisp syntax-highlighting font-lock
在 Emacs 中,我希望在 emacs lisp 中引用符号,例如:'blah,并以不同的颜色显示它们。如何使用font-lock 模式来做到这一点?
【问题讨论】:
标签: emacs lisp elisp syntax-highlighting font-lock
试试:
(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)))
这不会为 cmets 或字符串中的内容着色,因为它们之前已着色,并且 font-lock(默认情况下)不会重新着色。
【讨论】:
以下代码将启用引号本身的语法突出显示以及它后面的符号具有不同的面。如果需要,您还可以自定义这两个面孔。您可能还希望能够轻松发现'(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 的好处就来了。
【讨论】: