深入学习 Emacs 的 font-lock.el 灵活定制各种语法高亮(一)

深入学习 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 更新]

转载于:https://my.oschina.net/freeblues/blog/100407

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值