博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入学习 Emacs 的 font-lock.el 灵活定制各种语法高亮(一)
阅读量:5734 次
发布时间:2019-06-18

本文共 1438 字,大约阅读时间需要 4 分钟。

hot3.png

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

你可能感兴趣的文章
#51CTO学院四周年# 相约烤鸭”
查看>>
F#初学笔记06
查看>>
利用Failovr Cluster的Hyper-v创建高可用虚拟机
查看>>
Windows Server 2016-管理站点复制(一)
查看>>
实战:将企业域名解析委派给企业DNS服务器
查看>>
ExtJS应用架构设计(三)
查看>>
在Lync 2013环境部署Office Web Apps
查看>>
微软大会Ignite,你准备好了么?
查看>>
读书笔记-高标管事 低调管人
查看>>
Master带给世界的思考:是“失控”还是进化
查看>>
用户和开发者不满苹果iCloud问题多多
查看>>
Windows 8上安装本地回环网卡
查看>>
一位多年老站长告白:如何用老域名让新站快速上首页
查看>>
iOS开发那些事-Passbook详解与开发案例(附视频)
查看>>
attrs.xml中declare-styleable 详解(用于自定义控件的属性)
查看>>
MATLAB新手教程
查看>>
java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
查看>>
严苛模式(StrictMode)
查看>>
Android4.0源码Launcher启动流程分析【android源码Launcher系列一】
查看>>
错误“Unexpected namespace prefix "xmlns" found for tag LinearLayout”的解决方法(转)
查看>>