深刻學習 Emacs 的 font-lock.el 靈活定製各類語法高亮(一) 正則表達式
由於不大滿意Emacs缺省的語法高亮顯示,因此開始只是想研究一下EMACS的語法高亮原理,但願熟悉以後就能夠本身從新寫寫語法高亮的插件,結果一研究才發現,原來 font-lock.el 已經提供了很是靈活的定製方式,只不過不多有人去鑽研這個,也就是說不須要本身去怎麼從新寫了,只要把 font-lock.el 提供的各類方法用好了就能夠實現符合我的要求的定製化高亮界面。 shell
使用font-lock首先得把開關打開,須要在啓動文件中增長這條命令:
(global-font-lock-mode t) 函數
第一個函數: font-lock-add-keywords 參數1:Emacs模式名稱(如lisp-mode),前面須要加單引號 ' 參數2:正則表達式組成的列表,最前面須要加單引號 ' ,正則表達式用雙引號 " 引住,若是有多個正則式則用空格隔開
接下來就按照個人須要提出第一個定製化要求:lisp的括號不少,若是多個括號放一塊兒跟其餘代碼使用一樣顏色的話,看起來很不顯眼,因此我但願能把全部的左右括號所有設置爲跟普通代碼不一樣的顏色。 學習
這就須要使用帶正則表達式,在Emacs下,表示左右括號的正則式分別爲: 插件
( 的正則式:"[(]" code
) 的正則式:"[)]" 字符串
下面這個例子就是把左括號 "(" 和右括號 ")" 所有放入關鍵字列表,按照關鍵字的顯示方式來顯示(好比使用特定的顏色) emacs
(font-lock-add-keywords 'lisp-mode '("[(]" "[)]"))而後把這句代碼拷貝到 .emacs文件裏(若是使用LispBox則把它拷貝到 lispbox.el 中),總之就是要讓Emacs在啓動的時候執行它。
下面是執行後的高亮效果,是否是感受清晰一些? it
咱們知道,這只是最簡單的應用,那麼來點複雜的試試,先研究一下 font-lock.el 代碼中的例子 class
(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 更新]