5

在 Emacs 中,我想在 emacs lisp 中引用符号,例如:'blah并以不同的颜色显示它们。我怎样才能使用font-lock模式来做到这一点?

4

2 回答 2

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)))

这不会为注释或字符串中的内容着色,因为它们之前已着色,并且字体锁定(默认情况下)不会重新着色。

于 2012-12-17T14:42:46.073 回答
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 的好处就出现了(例如,如果您想让它也处理反引号。)

于 2013-09-02T12:58:00.840 回答