深入学习 Emacs 的 font-lock.el 灵活定制各种语法高亮(一)
因为不大满意Emacs缺省的语法高亮显示,所以开始只是想研究一下EMACS的语法高亮原理,希望熟悉之后就可以自己重新写写语法高亮的插件,结果一研究才发现,原来 font-lock.el 已经提供了非常灵活的定制方式,只不过很少有人去钻研这个,也就是说不需要自己去怎么重新写了,只要把 font-lock.el 提供的各种方法用好了就可以实现符合个人要求的定制化高亮界面。
使用font-lock首先得把开关打开,需要在启动文件中增加这条命令:
(global-font-lock-mode t)第一个函数: font-lock-add-keywords 参数1:Emacs模式名称(如lisp-mode),前面需要加单引号 '参数2:正则表达式组成的列表,最前面需要加单引号 ' ,正则表达式用双引号 " 引住,如果有多个正则式则用空格隔开
接下来就按照我的需要提出第一个定制化要求:lisp的括号很多,如果多个括号放一起跟其他代码使用同样颜色的话,看起来很不显眼,所以我希望能把所有的左右括号全部设置为跟普通代码不同的颜色。
这就需要使用带正则表达式,在Emacs下,表示左右括号的正则式分别为:
( 的正则式:"[(]"
) 的正则式:"[)]"
下面这个例子就是把左括号 "(" 和右括号 ")" 全部放入关键字列表,按照关键字的显示方式来显示(比如使用特定的颜色)
(font-lock-add-keywords 'lisp-mode '("[(]" "[)]"))然后把这句代码拷贝到 .emacs文件里(如果使用LispBox则把它拷贝到 lispbox.el 中),总之就是要让Emacs在启动的时候执行它。
下面是执行后的高亮效果,是不是感觉清晰一些?
我们知道,这只是最简单的应用,那么来点复杂的试试,先研究一下 font-lock.el 代码中的例子
(add-hook 'c-mode-hook (lambda () (font-lock-add-keywords nil '((\"\\\\\\=<\\\\(FIXME\\\\):\" 1 font-lock-warning-face prepend) (\"\\\\\\=<\\\\(and\\\\|or\\\\|not\\\\)\\\\\\=>\" . font-lock-keyword-face)))))
这是比较复杂的使用方式,先猜测下含义:正则表达式过滤出你希望高亮的字符串,数字1表示只对正则式中的第一个子串进行处理,font-lock-warning-face 表示使用这个 face 定义的颜色,具体看一下这个 face 是怎么定义的:
(defface font-lock-warning-face '((t :inherit error)) "Font Lock mode face used to highlight warnings." :group 'font-lock-faces)
只有最后那个参数 prepend 没搞懂是什么意思,在 font-lock.el 的代码里都没搜到它,只有两个还是出现在注释里。
[2013-01-28 更新]