最終更新:2005-2-9(Wed)
Emacs を使っていてじつにいろいろなことを忘れるので、メモしておくのだ。わしは version 20.7.2 で使っておるが、他の版でどうなるかは知らぬ。
Emacs でタブキーを押すと、どのモードにいるかによってこれは違うが、たいがいは単純にタブ文字が挿入されるわけではない。たとえば、いじくる前の私の環境のテキストモードではタブキーにバインドされている関数は indent-relative である。これは、直前の行のインデンションに合わせ、それが無理なら tab-to-tabstop を使う。
tab-to-tabstop というのは、タブ文字・スペースを使って、文字の頭をそろえるものである。この時に tab-stop-list という変数が参照される。これはリストで、たとえば (8 16 24 32 40 48 56 64 72 80 88 96 104 112 120) というような形をしている。このリストは、edit-tab-stops という対話的な関数で設定することができる。重要なことは、このリストに表われる数字は等差数列になっていなくてもいいということ、つまりタブストップが等間隔でなくてもよいということである。
tab-to-tabstop は、タブ文字だけによって、インデンションを行うわけではない。タブ文字によるインデンションは、 tab-width という変数にしたがうが、これは、スカラーだから、等間隔のインデンションしか実現できない。tab-to-tabstop は、tab-stop-list で定めた位置までジャンプするために、まずタブを使ってみて、たりない分はスペースで埋めるのである。Emacs のインデンションはこのように二重の仕組みで実現されている。
タブ文字だけでなくスペースも動員するというのがちょっとやっかいである。たとえば頻繁に修正しながら表を書いていくような場合、タブ文字だけなら1 ストロークで消せるが、スペースの連続が挿入されると、数回以上バックスペースキーを押さなくてはならない。しかも、画面上はタブで空いた空間なのか、スペースで空いた空間なのか区別がつかないので、必要以上に消去することが稀ではない。また、なにより、tab-width を変更すると、表の形がくずれてしまう。
(indent-tabs-mode に nil を設定すると、tab-to-tabstop でスペースだけが使われるようになるし、untabify はタブをスペースに変換する。しかし、タブの便利さの一部は失われるように思う。)
これに対する原始的な対処は、タブキーを、ちょうど一個だけのタブ文字を入力するようにすることだ。つまり、C-q [TAB] と同じことができればいい。ただし、グローバルなキーバインディングは、各モードに入ったときに上書きされてしまうから、設定ファイルを使って変更をするなら、モードを指定してやる必要がある。たとえば、テキストモードなら、
(add-hook 'text-mode-hook (function (lambda () (define-key text-mode-map "\t" 'self-insert-command))))
と、書いておけばよい。add-hook の第二引数には引数を持つ関数を書くことができないので lamda 式の形にせねばならず、関数のクオートには function を使う必要があるので、このようにちょっと長くなる。
タブの幅は tab-width で決められるから、最も原始的には、
(set 'tab-width 2)
などという式を当該バッファで評価してやればよい。tab-width は、バッファにローカルな変数である。つまり、このように設定をしても他のバッファには影響がない。グローバル値は (default-value 'tab-width) を評価すると知ることができる。バッファローカルな値は、たんに tab-width を評価すればわかる。グローバル値を設定するには、(setq-default tab-width 2) などとやればよい。
since Jul 17, 2003
otter@aqua.dti2.ne.jp
リンクフリー。ご自由にどうぞ。