はじめに
その昔,cycle-buffer.el がありました.(buffer-list) で得られるバッファリストを対象として, M-[ や M-] の押下でバッファを高速に切り替えることができる,とても便利なパッケージでした.このパッケージのおかげで,タブを常用せずに済んでいました.
しかし,時は流れ,ビルトインの bs.el に同等の機能が実装されていることから,現在はあまり使われていないようです.私も移行したユーザの一人です.
問題
bs.el を使用する場合は,bs-cycle-previous と bs-cycle-next に M-[ と M-] など,好みのキーをアサインすると幸せになれます.
(global-set-key (kbd "M-]") 'bs-cycle-next)
(global-set-key (kbd "M-[") 'bs-cycle-previous)
(with-eval-after-load "bs"
(custom-set-variables
'(bs-cycle-configuration-name "files-and-scratch")
'(bs-max-window-height 10))
ところが,ミニバッファに表示されるリストが非常にわかりにくい.特に,たくさんのバッファを開いている時には,とても辛くなります.「5つくらい先のバッファだから,M-]を5回連打して,あ,押しすぎた」という悲しい出来事を幾度となく経験しました.
bsv.el を使う
ということで,bs.el のミニバッファの表示を少し見やすくするパッケージを作りました.
正式リリース前ですが,安定しています.基本的に,bs.el の関数に advice をかけるパッケージですので,読み込みは次のようにします.
(with-eval-after-load "bs"
(when (require 'bsv nil t)
;; bsv の設定を記述する
))
bsv.el を無効化するには,M-x bsv-disable-advices とします.bs.el の素の振る舞いに戻ります.また再度 bsv.el を有効にする場合は,M-x bsv-enable-advices とすればOKです.
そして,bsv.el が有効の状態で以前と同様に M-] (bs-cycle-next) を押下すると,次のようになります.
M-[ (bs-cycle-previous) だと,こうです.格段に見やすくなった!(個人の感想です)
このように,bsv.el を読み込むことで,ivy-mode のような縦方向のリスト表示になります.ミニバッファに表示されるリストには,番号が付いています.これは,もう一度同じ方向にずらす時の順位を表しています.例えば上の例では,あと3回 M-[ を連打すれば, .emacs が表示されます.
ダイレクト選択
先程の例では, M-[ を3回連打で .emacs を表示できるとしましたが, bsv.el では 3 押下でダイレクトに .emacs を表示することができます.ミニバッファにリストが表示されている間は, 1 から 9 までの数値キーとバッファの番号が紐付けられます.したがって,例えばリストに「5. init.el」とある場合に,M-[またはM-]を5回連打しなくても良く,5を1回押下するだけでバッファを切り替えられます.下のアニメーションはダイレクト選択機能のデモです.
オプション
色々と好みが分かれそうなので,いくつかを defcustom に引き出しておきました.
| 変数 | デフォルト値 | type | 説明 |
|---|---|---|---|
| bsv-message-timeout | 5 | integer | この秒数後にミニバッファの表示が無効化します |
| bsv-slant | t | boolean | バッファ名を斜めにリスト表示します |
| bsv-max-height | 9 | integer | ミニバッファに表示するリストの最大数です.10以上を指定しても,9に補正されます |
| bsv-switch-by-key | 'number | symbol | ダイレクト選択の方法です.デフォルトは数値キーですが,この変数を 'function にすると,<f1>や<f2>等のファンクションキーの押下でバッファを選択できます. nil 指定で,ダイレクト選択機能をオフにできます |
| bsv-lighter | "Bsv" | string | ライターです.bsv-message-timeout の時間が経過すると,モードラインから自動的に消えます |
| bsv-show-countdown | t | boolean | 表示が無効化するまでの時間をモードラインでカウントダウンします |
なお実際にミニバッファに表示するバッファ数は,bsv-max-height の値に依らず,フレームの高さに応じて自動的に調整しています.フレームの高さが低い時は,1-2個程度しかミニバッファに表示されないかもしれません.これもユーザオプションにしても良いかもしれませんね.
今後の改良
次のような機能追加を考えています.
- もっとジョグダイアルのようにする(現在のバッファを表示リストの中心に持ってくる)
- all-the-icons に対応して,ファイルアイコンを出してもっと見やすくする
- [X] バッファが消えるまでの時間をモードラインでカウントダウンする
まとめ
bs.el を拡張する bsv.el を紹介しました.



