モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Emacsのphp-modeで設定しても2タブになってしまう

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(〜」の時、インデントを「{」と同じ扱いにしてほしい…と思ってたんですが、やっぱり同じこと考える人は多いみたいでその設定方法書かれている人がいました。


php-modeのインデント設定 - つまみぐいメモ

(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)))


自分はこれで大丈夫でしたが、ダメな場合もあるらしく、その時は下記のエントリーの方法を参考にするとよさそうです。

emacsのphp-modeでarrayのインデントを改善した | L2TP