如何确保Emacs中突出显示关键字的正确优先级?

时间:2014-06-07 17:44:06

标签: emacs lisp elisp

我试图为lisp方言写一个简单的主要模式。这是我的模式:

(defconst example-font-lock-keywords
  (list
   `(";.*" . font-lock-comment-face)
   `(,(regexp-opt '("function" "macro") 'symbols) . font-lock-builtin-face)
   `("\"[^\"]+?\"" . font-lock-string-face))
  "Highlighting for Example mode.")

(defvar example-mode-syntax-table
  (make-syntax-table))

(define-derived-mode example-mode lisp-mode "Example"
  "Major mode for editing Example lisp code."
  :syntax-table example-mode-syntax-table
  (set (make-local-variable 'font-lock-defaults) '(example-font-lock-keywords)))

这是我的示例程序:

; Highlighting tests.
; This is a comment despite "quotes"

(function foo () "bar")

这是我看到的结果:

emacs screenshot

我做错了什么?为什么字符串regexp' win'反对评论regexp?

2 个答案:

答案 0 :(得分:2)

Emacs分两个阶段突出显示缓冲区。第一个是语法阶段,它基于语法表中的信息,通常突出显示字符串和注释。第二个是关键字阶段。

在您的情况下,默认语法表将双引号设置为表示字符串。结果是,在执行关键字之前,字符串已经突出显示。默认情况下,仅当匹配内容中没有突出显示时才应用关键字,这就是为什么您的注释关键字仅适用于没有字符串的行的原因。 (有关覆盖的详细信息,请参阅OVERRIDE帮助文本中的font-lock-keywords标记。)

最适合您的解决方案是更新语法表,以便;表示“评论开始”,然后从您的关键字集中删除评论和字符串规则。

答案 1 :(得分:1)

尝试("\"[^\"]+?\"" 0 font-lock-string-face keep t)

或者颠倒两个条目的顺序(font-lock-comment-facefont-lock-string-face)。

请参阅Elisp手册,节点Search-based Fontification - 查找OVERRIDE以获取keep的说明。