【Emacs】
作業バッファをまとめて閉じる
(Buffer List、C-x C-b)

関連記事

1. 作業バッファをまとめて閉じたい

Emacs で作業していると、気づくとバッファが 10 個以上開いた状態になっていることがあります。

1. 作業バッファをまとめて閉じたい

SLIMEのREPLを開いたり、MarkDown文書を開いたり、それぞれにバッファが開くので、多くなると切替えで探しにくくなります。
そこで Buffer List で管理する必要があります。
C-x C-b で開く一覧画面で、現在開いているすべてのバッファを俯瞰しながら移動・保存・削除をまとめて操作できます。

1.1. ミニバッファ(C-x b)と専用バッファ(C-x C-b)

バッファ切り替えには C-x bC-x C-b の 2つがあります。
移動は C-x b、管理は C-x C-b と使い分けるのが一般的です。

C-x b はミニバッファでバッファ名を指定して即座に切り替える操作です。
バッファにアクセスした順番で並んでいるので、直前のバッファへ戻るだけなら C-x b Enter で済みます。
また、名前の一部を入力して補完できるので、行き先がわかっているときにも速いです。
キャンセルするときは、C-gです。

2. Buffer Listでバッファをまとめて閉じる

一方、C-x C-b*Buffer List* を開きます。
一覧を見ながら移動・整理できる画面で、バッファが増えてきたときの管理に向いています。

  1. C-x C-b で Buffer List を開く
  2. C-x o でそのウィンドウをアクティブにする
  3. 不要なバッファの行で d を押す
  4. 必要な数だけ繰り返す
  5. x で一括実行する

未保存の変更があるバッファを閉じようとすると確認が入るので、作業中の .lisp ファイルなどは事前に保存しておくと安心です。

2.1. Buffer Listの基本操作はDiredと同じ

*Buffer List* の操作は Dired と同じスタイルです。

キー動作
n (next) / p (previous)次・前の行へ移動
Enterカーソル行のバッファを開く
o (other window)別ウィンドウで開く
C-o別ウィンドウに表示しつつ、Buffer List にカーソルを残す
d (delete)削除予定マークを付ける
u (unmark)マークを解除する
Uすべてのマークを解除する
x (execute)マークされた操作を実行する

Dired が「ファイル一覧に削除マークを付けてあとで実行する」ように、Buffer List は「バッファ一覧に削除マーク(d)を付けてあとで実行(x)する」という使い方が基本です。
間違えて d を付けた行は u でマークを外せます。

Buffer List の列ヘッダーには、各バッファの状態を示すフラグ CRM が入ります。

  • C (current) は現在開いているバッファを示す .
  • R (read-only) は読み取り専用を示す %
  • M (modified) は未保存の変更があることを示す *

2.2. 閉じないほうがよい自動バッファ

*...* で囲まれた名前のバッファは、Emacs や拡張機能が自動生成したものが多いです。
内容を確認し終えたものは閉じても構いませんが、次のバッファは作業中に閉じると問題が起きることがあります。

バッファ名カテゴリ閉じて良い説明
*scratch*Emacs起動時に作られる一時バッファ。閉じると再作成されない
*Messages*Emacsエラーや警告のメッセージ履歴。閉じても再作成されるが、トラブル中は残す
*Native-compile-Log*Emacsネイティブコンパイルのログ。警告の調査中でなければ閉じても問題ない
*Shell Command Output*シェルシェルコマンドの出力。確認が終わったら閉じて構わない
*tramp/ssh ...*リモートSSH などリモート接続に関連するバッファ。作業中は閉じない
*slime-repl sbcl*SLIMECommon Lisp の REPL セッション本体。閉じると Lisp セッションを失う
*inferior-lisp*SLIMESLIME が起動する Lisp プロセスに紐づく。閉じるとプロセスに影響する
*slime-compilation*SLIMESLIME のコンパイル結果。エラー確認が終わったら閉じて良い
*slime-events*SLIMESLIME の内部イベント記録。挙動がおかしいときの調査に使う

REPL・実行プロセス・リモート接続・調査中のログに関係するバッファは、作業が終わるまで残しておくのが安全です。

3. 【補足】auto-revert-mode との相性問題

*Buffer List*d を付けていたら、数秒ほど消えてしまう現象がありました。
原因は auto-revert-mode でした。

(setq global-auto-revert-non-file-buffers t)Code language: Lisp (lisp)

global-auto-revert-mode を有効にしている場合、次の設定があると特殊バッファも自動更新の対象になります。
すると、*Buffer List* が自動更新で一覧が再生成され、このタイミングで d マークが失われます。

特殊バッファ全体の自動更新を止めるなら global-auto-revert-non-file-buffersnil に戻す方法があります

(setq global-auto-revert-non-file-buffers nil)Code language: Lisp (lisp)

*Buffer List* だけ auto-revert を無効にするには、Buffer-menu-mode-hook を使います。

(add-hook 'Buffer-menu-mode-hook
          (lambda ()
            (auto-revert-mode -1)))Code language: Lisp (lisp)