バッファ切り替えのためのパッケージ、iflipbの記事は色々見つかる。
特定のバッファを切り替え対象から除外する手段は本パッケージにいくつか用意されている。しかしながら、カレントバッファと同じメジャーモードを持つバッファたちに切り替え対象を限定する手段は存在しなかったので、設定を書いたというわけだ。こんな感じだ:
(require 'iflipb)
(defun my-iflipb-buffer-list ()
"Returns list of buffers whose major-mode is the same as current buffer's one."
(let ((cur-buf-list (buffer-list (selected-frame)))
(same-major-mode-buflist nil)
(currbuf-major-mode
(buffer-local-value 'major-mode (current-buffer))))
(dolist (buffer cur-buf-list)
(if (eq (buffer-local-value 'major-mode buffer) currbuf-major-mode)
(add-to-list 'same-major-mode-buflist buffer)))
(nreverse same-major-mode-buflist)))
(setq iflipb-buffer-list-function 'my-iflipb-buffer-list)
その他は以下の通り。
(setq iflipb-wrap-around t)
(setq iflipb-ignore-buffers (list "^[*]"))
(global-set-key (kbd "C-<tab>") 'iflipb-next-buffer)
(global-set-key (kbd "C-S-<tab>") 'iflipb-previous-buffer)
キーバインドについては以下も押しやすさの観点からは悪くない選択だと思われる:
(global-set-key (kbd "M-]") 'iflipb-next-buffer)
(global-set-key (kbd "M-[") 'iflipb-previous-buffer)
追記:
iflipb-ignore-buffers
で特定のバッファ名を除外しつつ、特定のメジャーモードではそのバッファ名の除外を解除したい場合が存在する。例えば、eww-mode
ではバッファ名は*eww*や*eww*<2>のように「アスタリスクから始まるバッファ名」であるから、上記のiflipb-ignore-buffers
の除外パターン"^[*]"にマッチしてしまう。
そこで、特定のメジャーモードではその制約を外すよう、変数iflipb-except-major-mode
を用意したうえで、キーバインドを以下のように設定する。設定ではeww-mode
のみになっているが、それ以外のメジャーモードもリストに加えることができる。
(defvar iflipb-except-major-mode (list 'eww-mode)
"A list of major modes that ignore even the exclusion
buffers specified by iflipb-ignore-buffers.")
(global-set-key (kbd "C-<tab>")
#'(lambda ()
(interactive)
(let ((currbuf-major-mode
(buffer-local-value 'major-mode (current-buffer))))
(if (memq currbuf-major-mode iflipb-except-major-mode)
(iflipb-next-buffer 4)
(iflipb-next-buffer 1)))))