Emacs 基于顶级s-expression关键字的字体锁定
我正在为支持两种稍有不同的编程语言的编程环境编写一个emacs主模式。两者都是Lisp(一个是Scheme),因此都使用s表达式。这两种语言的区别在于它们的函数定义关键字:scheme使用Emacs 基于顶级s-expression关键字的字体锁定,emacs,elisp,font-lock,Emacs,Elisp,Font Lock,我正在为支持两种稍有不同的编程语言的编程环境编写一个emacs主模式。两者都是Lisp(一个是Scheme),因此都使用s表达式。这两种语言的区别在于它们的函数定义关键字:scheme使用define,而另一种语言(称为xtlang)使用bind func 所以,在相同的缓冲区中,我有 (define foo ; this is scheme (lambda (a) (+ scheme-fn a)) (bind-func bar ; this is xt
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))
))
(字体锁定添加关键字无)
“((“(\\(定义)\\>”
(1字体锁定关键字面)
(“(\\(绑定函数)\\>”
(1字体锁定关键字面)
("\\"
(0字体锁定功能名称面))
("\\"
(0字体锁定功能名称面))
))
我想做的是能够根据语言(scheme/xtlang)对paren进行不同的着色。
因此,如果顶级defun是define
,则将表单中的所有参数涂成红色,如果是bind func
,则将表单中的所有关键字/函数涂成蓝色,同时仍将表单中的所有关键字/函数按正常方式高亮显示
这可能需要多行字体锁定,因为定义
/绑定函数
可能位于要突出显示的关键字的前一行。建议将字体锁定多行
与锚定在字体锁定关键字
中的匹配项结合使用可能是答案,但随后建议t-lock-multiline仅适用于多行方面是例外而非规则的情况
我的另一个选择似乎是使用
语法属性
,但我对其工作原理有点困惑-文档有点稀疏。处理此问题的最简单方法是利用以下事实:
MATCHER可以是要搜索的regexp,也可以是函数名
调用以进行搜索(使用一个参数调用,即
搜索
换句话说,您可以用一个函数替换regexp,如“\\”
,该函数使用向前重新搜索
重复搜索regexp,如果在正确的上下文中找到匹配项,则返回
有关使用此技术的包的具体示例,请查看标准Emacs发行版的cwarn模式