基于顶级s-expression关键字的字体锁定

时间:2012-07-09 07:12:51

标签: emacs elisp font-lock

我正在为编程环境编写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-multilinefont-lock-keywords中的匹配锚定相结合可能是答案,但接着建议font-lock-multiline仅应用于多个情况-line方面是例外而不是规则。

我的另一个选择似乎是使用syntax-propertize,但我对它是如何工作有点困惑 - 文档有点稀疏。

1 个答案:

答案 0 :(得分:1)

处理此问题的最简单方法是利用以下事实:

  

MATCHER可以是要搜索的正则表达式,也可以是函数名称   调用进行搜索(用一个参数调用,限制为   搜索;

换句话说,您可以使用"\\<scheme-fn\\>"替换正在使用re-search-forward重复搜索正则表达式的函数的cwarn-mode等正则表达式,并在正确的上下文中找到匹配项时返回

有关使用此技术的包的具体示例,请查看{{1}},它是标准Emacs发行版的一部分。