BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / linux / #7639同步于 2006/2/26
Linux机器人发帖

让你的 Emacs 自动输入合适的风格

leovirgo
2006/2/26镜像同步0 回复
用 C 写程序的人大多数都曾经为代码的风格争论过吧。例如,{} 的位置是像这样(K&R 或 BSD 风格): if (...) { some; } else { another; } 还是这样(GNU 风格): if (...) { some; } else { another; } 抑或是这样(相信大多数人都是这样吧): if (...) { some; } else { another; } 很明显,这种问题没有合理的答案;每个人都有他自己喜欢的风格。同时,有些人可能会反感(或至少不愿意)使用其他的风格。我自己就是这样一个人。我比较喜欢第一种(BSD 风格),如果是写给自己使用的程序的话绝不会使用其他的风格。 对于一个程序员来说,使用哪种风格并不是个人的选择,而更多的是他所在的开发组的选择。非常不幸的,我要同时使用三种风格。风格的转换是一件非常痛苦的事,不仅仅是要不时地停下来思考一个对一个文件应该使用哪个风格,还可能带有对自己不喜爱的其他风格的心理上的压迫感。此外,使用自己不习惯的风格需要一个适应的时间,而且可能会影响效率。 如果你和我一样,更喜欢 BSD 风格又同时使用 Emacs 作为自己的编辑器,你可以试试下面这段程序。把它加到 ~/.emacs 中,就可以让 Emacs 为你完成风格的转换。 (defun xgp-cfsi-modify-alist (alist term new) (let ((tl (assq term (symbol-value alist)))) (if tl (setcdr tl new) (add-to-list alist (cons term new))))) (defun xgp-cfsi (style) "Deciding whether using CFSI." (interactive "sStyle: ") (if (equal style "bsd") (progn (c-set-style "bsd") (setq indent-tabs-mode t c-hanging-braces-alist (quote ((defun-open after) (defun-close after) (brace-list-open after) (brace-entry-open after) (statement-cont after) (substatement-open after) (block-close . c-snug-do-while) (extern-lang-open after) (namespace-open after) (module-open after) (composition-open after) (inexpr-class-open after) (inexpr-class-close after) (class-open after) (class-close))) c-hanging-colons-alist (quote ((label after) (case-label after) (access-label after))) c-hanging-semi&comma-criteria (quote (c-semi&comma-inside-parenlist))) (local-set-key " " 'xgp-cfsi-bsd-SPC)) (progn (c-set-style style) (setq indent-tabs-mode nil c-hanging-colons-alist (quote ((label after) (case-label after) (access-label after))) c-hanging-semi&comma-criteria (quote (c-semi&comma-inside-parenlist))) ;; In GNU style, modify CLASS-OPEN for C-OFFSETS-ALIST (if (equal style "gnu") (progn (xgp-cfsi-modify-alist 'c-offsets-alist 'class-open '+) (xgp-cfsi-modify-alist 'c-offsets-alist 'class-close '+))) ;; CLASS-CLOSE (xgp-cfsi-modify-alist 'c-hanging-braces-alist 'class-close nil) (local-set-key " " 'self-insert-command)))) (defun xgp-cfsi-bsd-SPC () (interactive) (if (looking-back "^[ \t]*}[ \t]*\n[ \t]*$") (let ((s (save-excursion (search-backward "}") (1+ (point))))) (delete-region s (point)) (insert " ")) (insert " "))) 同时,修改一下 CC Mode 的 Hook: (defun my-c-mode-common-hook () (c-toggle-hungry-state t) (c-toggle-auto-newline 1) (local-set-key (kbd "<f9>") 'xgp-cfsi) (xgp-cfsi "bsd")) (add-hook 'c-mode-common-hook '(lambda () (my-c-mode-common-hook))) 最后,定义一下项目组使用的风格。这个可以用 M-x customize-variable RET c-offsets-alist RET 和 M-x customize-variable RET c-hanging-braces-alist RET 来完成。我所在的项目组使用了上面的第三种风格,定义完成后,我的 .emacs 的 custom-set-variable 中多了下面的参数: '(c-hanging-braces-alist (quote ((defun-open before after) (defun-close before after) (brace-list-open before after) (brace-entry-open before after) (statement-cont before after) (substatement-open before after) (block-close after) (extern-lang-open before after) (namespace-open before after) (module-open before after) (composition-open before after) (inexpr-class-open before after) (inexpr-class-close before after) (class-open before after) (class-close)))) '(c-offsets-alist (quote ((block-open . 0) (block-close . 0) (statement-block-intro . +) (substatement . +) (substatement-open . 0) (substatement-label . 0) (label . 0) (case-label . 0) (do-while-closure . 0) (else-clause . 0) (catch-clause . 0) (case-label . 0) (access-label . -) (namespace-open . 0) (class-open . 0) (class-close . 0) (innamespace . 0)))) 这样就完成了自定义的过程。打开一个 C/C++ 文件后,默认是 BSD 的风格。如果我为我所在的项目组开发程序,可以按 F9,输入 user 并回车,之后 Emacs 就会自动按这个风格排版程序;为 GNU 写程序时,则可以按 F9 gnu RET 来调整到 GNU 风格。当然,这些都是建立在按键习惯是 BSD 风格的按键习惯的基础上的。 我发现这样做非常有效:不用修改自己的按键习惯,就可以输入合适风格的程序。这实在是一件非常方便的事。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。