Shammer's Philosophy

My private adversaria

Emacs自動改行設定

プログラムのソースコードを書いていると、自動改行してほしい・・・と思うことがたくさんある。Emacsでもデフォルトでそのパターンが定義されていたりするが、もっと細かく自分仕様にカスタマイズする方法がわかったのでメモしておく。

まず、設定に関する変数は「c-hanging-braces-alist」という変数である。これを、.emacs等で定義することになる。以下、設定例。

(add-hook 'c-mode-common-hook
                 '(lambda ()
                   (setq c-auto-newline t);※1
                   (setq c-hanging-braces-alist '((brace-list-open)
                                                                  (brace-entry-open)
                                                                  (substatement-open after)
                                                                  (block-close . c-snug-do-while)
                                                                  (extern-lang-open after)
                                                                  (inexpr-class-open after)
                                                                  (inexpr-class-close before)))))

※1は、自動改行そのものを有効にする、という設定。これは、

{ } : # ; , < > / *

が、文字列入力中以外に現れた(タイプされた)際に自動改行する、というもの。
どのように自動改行するか、というのが「c-hanging-braces-alist」という設定。
これは、(構成要素 . 改行方法)という形で複数設定できる。

この構成要素は、「Syntactic Symbols」のことで、CC Mode Manualなどに細かい説明がある。ちなみに、上記の設定例はここのサンプルからのコピーです。
改行方法は、「nl-list」のことで、GNU Emacs¥Þ¥Ë¥å¥¢¥ë: Electric Cなどに説明がある。指定できるのは、before、after、both、nilのいずれかである。

とりあえず、自分は上の設定である程度満足した。より細かく調べたいときは、Syntactic Symbols とか、c-hanging-braces-alist でGoogleすればいいだろう。

最終的に、add-hookの内容は以下のようになった。

(add-hook 'c-mode-common-hook
	  '(lambda ()
	     (setq indent-tabs-mode t)
	     (setq c-auto-newline t)
	     (setq c-hanging-braces-alist '((brace-list-open)
					    (brace-entry-open)
					    (substatement-open after)
					    (block-close . c-snug-do-while)
					    (extern-lang-open after)
					    (inexpr-class-open after)
					    (inexpr-class-close before)))
	     (setq c-basic-offset 4)
	     (setq c-indent-level 4)
	     (setq c-tab-width 4)
	     (define-key c-mode-base-map "\C-j" 'newline-and-indent)
	     )
	  )