Emacs:タブを使わない究極のバッファー移動


Emacsのバッファー移動は、tabbar / ELscreen などのタブ系を使っていましたが、diredなどの隠れていてほしいバッファーまで開いてしまうのが嫌でした。

そんなときに、るびきちさんのこの記事を読んでiflipb.elを試してみました。

標準機能の switch-to-buffer に比べてユニークな動作をすることは上記の記事で理解できたのですが、GitHubのReadme を読むと以下のような機能も設定できることがわかりました。

  • 非表示のバッファーを設定できる:iflipb-ignore-buffers
  • 戻り機能(最後になったら先頭へ戻る)を設定できる:iflipb-wrap-around

iflipbの設定

;; iflipb
(setq iflipb-ignore-buffers (list "^[*]" "^magit" "]$"))
(setq iflipb-wrap-around t)
(bind-key "C-<right>" 'iflipb-next-buffer)
(bind-key "C-<left>" 'iflipb-previous-buffer)

ignore-buffersの設定は、正規表現が使えます。上記の設定では以下のバッファーを設定しています。

  • *scratch*などのアスタリスクのついたもの: "^[*]"
  • magit-statusを実行するたびに作られるもの: "^magit"
  • diredバッファー: "[dir]$"

私の場合、diredのバッファー名には、hogehoge[dir] というふうに [dir] を付加してファイル名と勘違いしないように工夫していますので、最後方の文字列にマッチさせる正規表現 "[dir]$" で機能します。

ミニバッファーがタブ代わりになる

実際に使ってみてわかったのですが、バッファー移動操作をするとミニバッファーに以下のように開いているバッファー名が表示されます。(カレントバッファーは、[ ]で囲われて表示されます。)

tabbar感覚で使えるのでなかなか面白いです。

scratchバッファーだけは直ぐに開きたい

作業中に付箋感覚で使ったり、ちょこっとした式を評価したりとよく使うので*scratch*だけはどんなタイミングでも直ぐ開きたいですね。そのためにELscreenをタブ無しで使うことにしました。

ヒントになったのは下記の記事です。

elscreenの設定

;; elscreen
(setq elscreen-display-tab nil)  ;; Turn off tabs
(setq elscreen-tab-display-kill-screen nil)
(setq elscreen-tab-display-control nil)
(elscreen-start)
(elscreen-create) ;; start with 2 tabs

(bind-key "C-<tab>" 'elscreen-next)

ただし上記設定だけでは*scratch*を二面開く…という感じになって味気ないので、Emacs起動時のカレントバッファーには、以前、別記事で紹介した dashboard を表示させるようにしました。

こうすることでelscreenの裏面に*scratch*バッファーが開かれ、表面に*dashboard*が表示されます。そして、C-<tab>することで表裏の切り替えができるのです。

実際の作業は表面を使い、iflipbを使って複数のバッファーを行き来し、必要なときはC-<tab>でいつでも*scratch*が呼び出せるという仕組みです。