我正在为支持两种略有不同的编程语言的编程环境编写 emacs 主要模式。两者都是 lisps(一个是 Scheme),所以都使用 s 表达式。这两种语言的区别在于它们的函数定义关键字:scheme 使用define
,而另一种语言(称为 xtlang)使用bind-func
所以,在同一个缓冲区中,我有
(define foo ; this is scheme
(lambda (a)
(+ scheme-fn a))
(bind-func bar ; this is xtlang
(lambda (b)
(* xtlang-fn b))
我有字体锁定工作,使用类似的东西
(font-lock-add-keywords nil
'(("(\\(define\\)\\>"
(1 font-lock-keyword-face))
("(\\(bind-func\\)\\>"
(1 font-lock-keyword-face))
("\\<scheme-fn\\>"
(0 font-lock-function-name-face))
("\\<xtlang-fn\\>"
(0 font-lock-function-name-face))
))
我想做的是能够根据语言(方案/xtlang)对括号进行不同的着色。
因此,如果顶层 defun 是 a define
,则将表单中的所有括号着色为红色,如果它是 a ,则将其着色为蓝色bind-func
,同时仍然像往常一样突出显示表单中的所有关键字/函数。
这可能需要多行字体锁定,因为define
/bind-func
可能位于要突出显示的关键字的前一行。 该线程建议font-lock-multiline
与 match-anchored in 结合使用font-lock-keywords
可能是答案,但随后建议font-lock-multiline
仅在多行方面是例外而不是规则的情况下使用。
我的另一个选择似乎是使用syntax-propertize
,但我对它的工作原理有点困惑 - 文档有点稀疏。