前两天接了一个任务——统一代码缩进格式。
要求不算高,确保没有TAB键并缩进四格。问题是几十个文件,总得有点手段才行,谁让咱是懒惰的程序员呢!尝试了indent和astyle,都不甚理想,indent主要是处理C,而我们用C++,astyle号称也能处理C++和Java,却把bit field当成了label。最后还是决定用emacs,毕竟它有c++-mode。
写了两个脚本——reindent.sh和reindent.el。reindent.sh是驱动程序;reindent.el则完成缩进工作,它必须放在emacs的load path里面,比如可以放在/usr/share/emacs/site-lisp/,放在当前目录或使用显式路径都是没有用的。
reindent.sh的内容如下:
#!/bin/bash set -o verbose for d in dir_a dir_b/subdir_c; do for f in `find $d -iname "*.[hc]"`; do emacs --no-site-file --batch $f -l reindent done done
reindent.el的文件内容如下:
(add-hook 'c++-mode-hook '(lambda() (setq indent-tabs-mode nil) (c-set-style "stroustrup") (c-set-offset 'case-label 4) (c-set-offset 'inline-open 0) (c-set-offset 'cpp-define-intro 0) (c-set-offset 'func-decl-cont 0))) (c++-mode) (indent-region (point-min) (point-max)) (untabify (point-min) (point-max)) (save-buffer)
其中包括了一些根据特定项目需要而做的定制和hack,详见CC Mode手册。