そろそろEmacsのウィンドウについて一言いっとくか

Emacsはひとつの窓(ふつうの意味の「ウィンドウ」、Emacs用語の「フレーム」)の中に複数の表示領域(Emacs用語の「ウィンドウ」)を持つことができる。そして、ヘルプ等を表示させる場合はEmacsが勝手に画面を分割して別のウィンドウに表示させる。まぁ、Emacsを使ってるならみんな経験してることだ。

ワイドディスプレイが台頭する中、フレームの横幅はどんどん長くなっている。Emacs22までだと強制的に上下分割されてとても使いづらかった。Emacs23になったら横幅にあわせて、上下分割か左右分割か判断してくれるようになった。横幅が広いと左右分割してくれる。表示行数が減らないのでこれは嬉しい。画面の有効活用だ。

Emacs22で左右分割させたいならば、M-x install-elisp-from-emacswiki display-buffer-for-wide-screen.elしてくれ。Emacs23になったらもはや不要だ。

これだけ広いフレームを持つようになったら、3分割以上もしたくなるはずだ。しかし、デフォルトのEmacsは3分割以上になるとひどく使い勝手が落ちてしまう。これは以下が原因だ。

  • ウィンドウを切り換えるコマンドのキー割り当てが悪い
  • ウィンドウを分割するコマンドのキー割り当て・使い勝手が悪い
  • C-x 4系(other-windowがついている)コマンドの使い勝手が悪い

まず、ウィンドウを切り換えるコマンド other-window だが、頻繁に使うコマンドにもかかわらず、あろうことか C-x o というひどく押しづらいキーに割り当てられている。2分割までだったら我慢できるが、3分割以上されている場合C-x o C-x o ...あるいはC-u 数 C-x oと操作しなければならない。やってみるとわかるが、これは非常に打ちづらい。なぜなら、Ctrlを押して離してを繰り返しているからだ。これは、割り当てるキーが決定的に間違っている。これはひどい

ウィンドウを分割すコマンドはC-x 2 (split-window-vertically)とC-x 3 (split-window-horizontally)がある。これも押しづらい。しかも、分割した先のウィンドウへ飛んでくれないから、新たなウィンドウで作業するには続けてC-x oも押さないといけない。あーやだ…

重要なコマンドには、たいてい別ウィンドウに作用する亜種が用意されている。たとえば、C-x C-f (find-file)にはC-x 4 C-f (find-file-other-window)が用意されている。C-x C-fはCtrlを押したままなので素早く押すことができるが、間に4を加えるとCtrlを離して再び押す必要がでてきて、一気に押しづらくなる。しかも、2分割ならば別ウィンドウは明らかだが、これが3分割以上になるとどこのウィンドウがターゲットになるのか直感的にはわからない。勘弁してくれよ…

それだけではない。そもそも、「ファイルを開く」と「別ウィンドウに表示する」は直交する操作だ。M-x apropos-command RET -other-window$ を実行してくれ。ものすごい数の-other-windowコマンド群が出てくるぞ。おいおい、勘弁してくれ。コマンドごとに定義してたらキリがねえだろ。考え方おかしいよ…

このように、現状のEmacsのウィンドウの扱いは腐ってるとしか言いようがない。「ターゲットとなるウィンドウを選択してからふつうのコマンドを実行すりゃいい」んだよ。発想を転換しようよ。

そのためには、other-windowは1ストロークにしないといけない。1ストロークにすることで連打可能になり、3分割以上になってもすばやくウィンドウを選択できる。C-tやC-zあたりに割り当てるといいだろう。これで-other-window系のコマンドは使う必要がなくなる。もはやメモリの肥やしに過ぎない!

もうひとつ。other-windowは分割していないときには何も動作しない。せっかく1ストロークにわりあてたのに、これでは勿体ない。分割してない状態のときにも働いてもらおう。分割してないときは、分割するようにしよう。押しやすいキーには、状況に応じて空気を読んでくれるコマンドを割り当てるのが使い勝手を向上させるポイントだ。機能とコマンドとキーバインド : Emacs Advent Calendar jp: 2009 - 技術日記@kiwanamiの「コンテキスト依存コマンド」が参考になる。

(defun other-window-or-split ()
  (interactive)
  (when (one-window-p)
    (split-window-horizontally))
  (other-window 1))

(global-set-key (kbd "C-t") 'other-window-or-split)

たったこれだけのコードで上記の問題をすべて解決し、Emacsのウィンドウと仲良くなれるぞ。どうぞお試しあれ!

発想の転換ってとても大事なことだよ!

返信

shiro 2010/02/11 01:29 デフォルトの\C-t (transpose-chars)、私は良く使うんですが、あんまり人気ないみたいですね。 私はCtrl-Tabをother-windowに割り当てて使っています。

C-tの便利さはわかりますが、生憎ローマ字レベルで動作してくれないので使ってないです。「kudasia C-t」と打つと「くだあし」と出て「ください」となってくれない。

2560x1600のディスプレイを使ってるので、ソースの解析作業の時に16分割とかやってみたけど、逆にわかりにくくなってウケた経験がある。 via http://d.hatena.ne.jp/scinfaxi/20100210/1265821787

スクリーンショットがあるのならば、見てみたいものですw