• 作成:

Emacsでファイルとディレクトリのバッファのみを閉じる関数を書きました

問題

これまで

(defun kill-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))

(global-set-key (kbd "C-M-S-q") 'kill-all-buffers)

で割り当ててEmacsを終了する時に作業をリセットしたい時に使っていたのですが, 最近lsp-modeを使うようになって, lsp-modeはlspの接続バッファを終了させると再起動するか聞いてくるのでこの関数だと面倒です.

やりたいこと

ファイルに紐付けられてるバッファとdiredのバッファのみを閉じたい.

実装

ファイルに紐付けられてるバッファのみを取得するのは簡単です.

buffer-listでリスト一覧を取得できて, buffer-file-nameでファイル名を取得できます.

参考: Emacs Lisp のバッファ関連のオペレータ - ほんとのこと知りたいだけなのに。

ELISP> (remove-if-not #'buffer-file-name (buffer-list))
(#<buffer 2019-12-07-17-47-37.md> #<buffer 20_global-set-key.el> #<buffer ncaq-emacs-utils.el> #<buffer 2019-12-07-15-55-15.md> #<buffer buff-menu.el> #<buffer package.use.mask> #<buffer package.use> #<buffer devel-env>)

問題はdiredのバッファの取得です.

buffer-dired-pみたいな関数があれば良いのですがどうやらないらしい.

elisp - emacs lisp, how to get buffer major mode? - Stack Overflow の下の方の回答によると buffer-local-valuemajor-modeを取得するのが良いらしいですね.

というわけでbuffer-dired-pを書きました.

(defun buffer-dired-p (buffer)
  (eq (buffer-local-value 'major-mode buffer) 'dired-mode))

これを使って

(defun kill-file-or-dired-buffers ()
  (interactive)
  (mapc 'kill-buffer
        (remove-if-not
         (lambda (buffer)
           (or
            (buffer-file-name buffer)
            (buffer-dired-p buffer)))
         (buffer-list))))

新しい関数が書けました.