[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 {
};

}}}

もしかして、このスタイルは少数派なのかなぁ……