[emacs] c++-mode の妙なインデントを修正
随分前の話だが、emacs22 にバージョンアップした際に、↓のように 連なった namespace { 内のインデントが c-basic-offset × (namespace個数 - 1)になってしまった
※"....|"は1インデントを表している
namespace foo { namespace bar { namespace baz { ....|....|class Quux { ....|....|}; }}}
色々調べた結果、2個目以降の namespace ブロックが その都度defun-block-intro と判断されるようになったためらしい。
本当は、defun-block-intro と判断させないようにしたかったが、方法が分からなかったので、下記のような多少強引な方法で対処した。
(defun my-c-defun-block-intro (langelem) (save-excursion (let ((org-pos (point)) (pos (cdr langelem))) (goto-char pos) (if (re-search-forward "namespace[ ]*[a-zA-Z_a-9]+[ ]*{" org-pos t) 0 c-basic-offset)))) (defun my-c++-mode-hook () (c-set-offset 'defun-block-intro 'my-c-defun-block-intro) ..... ) (add-hook 'c++-mode-hook 'my-c++-mode-hook)
debuf-block-introと判断されたときに、namespace { があった場合、インデントを 0 にしている。
/*namespace foo { */ なんて記述があっても反応してしまう手抜き仕様だが、とりあえずはこれで良し
導入後のインデントは下記のようになる。
namespace foo { namespace bar { namespace baz { class Quux { }; }}}
もしかして、このスタイルは少数派なのかなぁ……