emacsのタブキーの挙動

Fedoraを7か8に上げたあたりから、emacsのバージョンアップに伴って、Fundamentalモードでのタブキーの動作が変わってしまいました。タブを押すと、前行の空白位置に合うまで進むようになったんですよね。Text-modeとかならともかく、Fundamentalでやられると激しく気持ち悪いのは私だけ? 元通り、タブ位置(8,16,24,...)に飛んで欲しいので、ちょっと調べてみました。
elispのマニュアルによると、indent-line-function という変数によってタブキーの動作がモードごとに決まるようです。で、emacs -qで起動 → M-x fundamental-mode → M-: indent-line-function とかやってデフォルトを調べてみると、indent-relative という関数になっていることが判明。怪しい。マニュアルを引いてみると、

このコマンドは、空白でないまえの行のつぎの字下げ位置のコラムに 達するまで、ポイント位置に白文字を挿入する。

ということで、やはりこれが原因のようです。というわけで、.emacsに次のように書いておけばOKのようです。

(setq indent-line-function 'tab-to-tab-stop)

tab-to-tab-stopは、tab-stop-listというリストに入っている値のどれかまで字下げする、というモノ。ある程度フツーにtabを入れてくれるので、まあ良いかな、と。

追記

emacs 24?だと変な挙動になるので

(setq indent-line-function 'indent-to-left-margin)

のほうがいいらしい。


ちなみに、この設定を行ってもText-modeにするとindent-relativeになりますので、ある程度使い分けられます。Text-modeでも動作を変えるなら、

(add-hook 'text-mode-hook
	  (lambda ()
	    (setq indent-line-function 'tab-to-tab-stop)))

などとメジャーモード用のフックを使えば良いでしょう。

CやLispなどのメジャーモードでは、別のTab動作が割り当てられていることも多いようですので、個別に対応する必要があります。
どうでもいいですが、私は下のようにCモードではLinuxライクなインデントをしてくれるようにしています。

(add-hook 'c-mode-common-hook
          '(lambda ()
             (c-set-style "linux")
	     (setq tab-width 8)))