|
|
发表于 2006-3-11 15:15:31
|
显示全部楼层
Post by pluskid
这个确实不是Courier New,我没有用Courier New,因为用起来很难看!
:!! 哈哈!确实!写错了!
c-toggle-auto-newline确实很好用呀,只是暂时还不习惯,哈哈!但是c-subword-mode是干什么的?我用describe-function c-subword-mode也看不出什么名堂来呀?
c-subword-mode 就是用来使 forward-word 和 backward-word 在像 ThisIsAVariableName 这样的标识符中每次移动一个单词而不是整个标识符的模式。
使用 c-toggle-auto-newline 要和三个变量 c-hanging-braces-alist、c-hanging-colons-alist、c-hanging-semi&comma-criteria 联合使用。这里是我为了让它符合我的风格写的代码:
- (defvar xgp-cfsi-left-PAREN-old nil
- "Command used to input "("")
- (make-variable-buffer-local 'xgp-cfsi-left-PAREN-old)
- (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-list-close) (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)))
- ;; CLASS-CLOSE
- (xgp-cfsi-modify-alist 'c-hanging-braces-alist 'class-close nil)
- (local-set-key " " 'self-insert-command)
- ;; In GNU style, '(' is always after ' '
- (if (and (equal style "gnu") (not xgp-cfsi-left-PAREN-old))
- (progn (setq xgp-cfsi-left-PAREN-old (lookup-key (current-local-map) "("))
- (local-set-key "(" 'xgp-cfsi-gnu-PAREN)))))
- ;; this is correct since ONLY GNU style put a ' ' before '('
- (if (and (not (equal style "gnu")) xgp-cfsi-left-PAREN-old)
- (progn (local-set-key "(" xgp-cfsi-left-PAREN-old)
- (setq xgp-cfsi-left-PAREN-old nil))))
- (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 " ")))
- (defun xgp-cfsi-gnu-PAREN ()
- (interactive)
- (if (not (looking-back " "))
- (insert " "))
- (funcall xgp-cfsi-left-PAREN-old nil))
- (defun xgp-cfsi-erase-blanks ()
- "Erase all trivial blanks for CFSI."
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "[ \t]+$" nil t)
- (replace-match "" nil nil))))
复制代码
这里的核心函数是 xgp-cfsi,它接受风格名作为参数,并设置自动换行的方式。这样,在 bsd 风格中只有函数声明、单独的 if、while 和 for 的子句以及枚举和初始化说明中需要手工按回车,其他情况中 Emacs 都会自动插入回车。然后我在 c-mode-common-hook 中加入了 (c-toggle-hungry-state 1)、(c-toggle-auto-newline 1),以及 (xgp-cfsi "bsd") 来将默认风格置为 bsd。同时,如果需要输入其他风格的程序,Emacs 都会自动地进行排版。当然,我在公司的开发组要求了一种我不喜欢的风格 (这也是我自己写这个函数的原因),它是这样设置的:
- '(c-hanging-braces-alist (quote ((defun-open before after) (defun-close before after) (brace-list-open after) (brace-list-close) (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-toggle-auto-newline 可以提供一个非常方便的代码编写方式。
我的代码只是参考,你可以结合它以及上面提到的三个变量的说明来训练 Emacs 使它完全符合你的风格要求  |
|