为#ifdef上色

和所有的Emacs应用一样,把此文件放到Emacs能搜 索到的路径下。在~/.emacs里加入如下语句

;;; add ifdef.el
(add-hook 'c-mode-common-hook
	  '(lambda ()
	     (require 'ifdef)
	     (global-set-key [?\C-c ?\C-i] 'mark-ifdef)))

它的作用是打开C文件的时候自动加载ifdef,并把快捷键C-c Tab绑定到 mark-ifdef函数上。

按下C-c Tab就会对当前buffer的C文件里的#ifdef、#else、#endif上色。不 同层次的#ifdef有不同的颜色。

mark_ifdef

我们可以看到,最外层的#ifdef是蓝色的、第二层是绿色的、第三层是黄色 的。第四层在此段代码里没有出现(它已经够乱了),如果出现,将是红色。 再次按下C-c Tab会取消上色。

我只设了四个层次。嵌套超过了四层怎么办? 如果你被迫看这样的代 码,那是你的不幸。 如果是你自己写的,那……去死吧:-)

类似的层次结构一再出现,比如Makefile里的if...endif结构,XML里的结构 等。为何不写一个通用的函数呢,让用户自己指定结构的开始、中间与结尾标记。 当然用户得知道一些regular expression的概念。mark-ifdef3就是这样一个函 数,用户传给它三个参数,分别是开始标记、结尾标记和中间标记。中间标记就 是类似#else这样的东西,也可以为nil。 这是一个例子:

(defun mark-if-makefile ()
  "Mark if ... else ... endif in GNU makefile."
  (interactive)
  (mark-ifdef3 "^[ 	]*if.*$"
               "^[ 	]*endif.*$"
               "^[ 	]*el.*$"))

方括号里的空白其实是空格、制表符的组合。这样就快速生成了一个分析 makefile里的if...else...endif的结构。

关于中间层的标记:有时中间层会有多种选择,比如:else 和 elif。emacs 有个函数regexp-opt可以帮你生成regular expression:

(regexp-opt '("else" "elif") nil)
=> "el\\(?:if\\|se\\)"

最近更新: $Date: 2006-06-03 14:16:24 +0800 (Sat, 03 Jun 2006) $