我试图为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")
这是我看到的结果:
我做错了什么?为什么字符串regexp' win'反对评论regexp?
答案 0 :(得分:2)
Emacs分两个阶段突出显示缓冲区。第一个是语法阶段,它基于语法表中的信息,通常突出显示字符串和注释。第二个是关键字阶段。
在您的情况下,默认语法表将双引号设置为表示字符串。结果是,在执行关键字之前,字符串已经突出显示。默认情况下,仅当匹配内容中没有突出显示时才应用关键字,这就是为什么您的注释关键字仅适用于没有字符串的行的原因。 (有关覆盖的详细信息,请参阅OVERRIDE
帮助文本中的font-lock-keywords
标记。)
最适合您的解决方案是更新语法表,以便;表示“评论开始”,然后从您的关键字集中删除评论和字符串规则。
答案 1 :(得分:1)
尝试("\"[^\"]+?\"" 0 font-lock-string-face keep t)
。
或者颠倒两个条目的顺序(font-lock-comment-face
和font-lock-string-face
)。
请参阅Elisp手册,节点Search-based Fontification
- 查找OVERRIDE
以获取keep
的说明。