我正在为编程环境编写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))
))
我希望能够根据语言(scheme / xtlang)以不同方式为parens着色。
因此,如果顶级defun为define
,则将所有parens的颜色设置为红色;如果是bind-func
,则为蓝色,同时仍然将表单中的所有关键字/函数突出显示为正常。
这可能需要多行字体锁定,因为define
/ bind-func
可能位于要突出显示的关键字的前一行。 This thread建议将font-lock-multiline
与font-lock-keywords
中的匹配锚定相结合可能是答案,但接着建议font-lock-multiline
仅应用于多个情况-line方面是例外而不是规则。
我的另一个选择似乎是使用syntax-propertize
,但我对它是如何工作有点困惑 - 文档有点稀疏。
答案 0 :(得分:1)
处理此问题的最简单方法是利用以下事实:
MATCHER可以是要搜索的正则表达式,也可以是函数名称 调用进行搜索(用一个参数调用,限制为 搜索;
换句话说,您可以使用"\\<scheme-fn\\>"
替换正在使用re-search-forward
重复搜索正则表达式的函数的cwarn-mode
等正则表达式,并在正确的上下文中找到匹配项时返回
有关使用此技术的包的具体示例,请查看{{1}},它是标准Emacs发行版的一部分。