2

我正在为支持两种略有不同的编程语言的编程环境编写 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,但我对它的工作原理有点困惑 - 文档有点稀疏。

4

1 回答 1

1

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

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

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

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

于 2012-12-17T14:54:43.193 回答