Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs 基于顶级s-expression关键字的字体锁定_Emacs_Elisp_Font Lock - Fatal编程技术网

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

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

我正在为支持两种稍有不同的编程语言的编程环境编写一个emacs主模式。两者都是Lisp(一个是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))
                          ))
(字体锁定添加关键字无)
“((“(\\(定义)\\>”
(1字体锁定关键字面)
(“(\\(绑定函数)\\>”
(1字体锁定关键字面)
("\\"
(0字体锁定功能名称面))
("\\"
(0字体锁定功能名称面))
))
我想做的是能够根据语言(scheme/xtlang)对paren进行不同的着色。

因此,如果顶级defun是
define
,则将表单中的所有参数涂成红色,如果是
bind func
,则将表单中的所有关键字/函数涂成蓝色,同时仍将表单中的所有关键字/函数按正常方式高亮显示

这可能需要多行字体锁定,因为
定义
/
绑定函数
可能位于要突出显示的关键字的前一行。建议将
字体锁定多行
与锚定在
字体锁定关键字
中的匹配项结合使用可能是答案,但随后建议t-lock-multiline仅适用于多行方面是例外而非规则的情况


我的另一个选择似乎是使用
语法属性
,但我对其工作原理有点困惑-文档有点稀疏。

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

MATCHER可以是要搜索的regexp,也可以是函数名 调用以进行搜索(使用一个参数调用,即 搜索

换句话说,您可以用一个函数替换regexp,如
“\\”
,该函数使用
向前重新搜索
重复搜索regexp,如果在正确的上下文中找到匹配项,则返回

有关使用此技术的包的具体示例,请查看标准Emacs发行版的
cwarn模式