Emacs上でphpのコードを書くときに、PEARのコーディングスタイルに合わせるため、4タブにしようとしていたのですが、うまくいかずどうしても2タブになってしまっていました。
普通、モードごとのタブ幅を摂提する場合
(add-hook 'php-mode-hook (lambda () (setq tab-width 4))
とすれば良いはずです。
また、実はphp-modeでPEARのコーディングスタイルにするための設定があり
(setq php-mode-force-pear t)
と設定しておくだけで、PEARのコーディングスタイルにしてくれます。
が、どちらもこれだけだとうまく設定されず、2タブになってしまうのです。
で、これを解決するには
(add-hook 'php-mode-hook (lambda () (setq tab-width 4) (setq c-basic-offset 4))
と c-basic-offset も設定すれば良い、ということがわかりました。
しかし、なぜこれが必要なのだろう??という疑問が。
ということをtwitterでつぶやいてたら、@kfujieda氏より色々と教えていただいて理由がわかりました。
Twitter / kfujieda: @stealthinu ...
ビンゴです。gnuはc-basic-offsetを2に上書きします。
自分はc-modeの設定で
(add-hook 'c-mode-hook (lambda () (c-set-style "gnu"))
のような感じに設定していたのですが、この設定してると php-mode-force-pear を指定していても、中で c-basic-offset を2に上書きしてしまうようです。
ということで、ちょっとムダな設定のように見えますが
(setq php-mode-force-pear t) (add-hook 'php-mode-hook (lambda () (setq tab-width 4) (setq c-basic-offset 4) (setq indent-tabs-mode nil)))
という感じにして対応しています。
(追記)
PHPで「array(〜」の時、インデントを「{」と同じ扱いにしてほしい…と思ってたんですが、やっぱり同じこと考える人は多いみたいでその設定方法書かれている人がいました。
(add-hook 'php-mode-hook (lambda () (c-set-offset 'case-label' 4) (c-set-offset 'arglist-intro' 4) (c-set-offset 'arglist-cont-nonempty' 4) (c-set-offset 'arglist-close' 0)))
自分はこれで大丈夫でしたが、ダメな場合もあるらしく、その時は下記のエントリーの方法を参考にするとよさそうです。