xyzzy の Buffer List を活用する

xyzzy の Buffer List は C-x C-b で表示することができ、バッファ一覧を表示するほか、マークを付けて一括で保存したりファイルを閉じたりできる。

主な操作は次の通り。

  • SPC: 次の行へ
  • f: 現在のウィンドウでバッファを開く
  • o: 他のウィンドウでバッファを開く(ウィンドウが一つしかないときは分割する)
  • q または 1: カーソル行のバッファ開き、ウィンドウを一つだけにする
  • s: 保存マークを付ける (save)
  • d または k: バッファを閉じる (delete/kill) マークを付ける
  • u: マークを解除する (unmark)
  • x: マークをつけた処理を実行する (execute)

Buffer List を便利に使うために次の機能を追加した。

  • Buffer List を表示したまま他のウィンドウにバッファを表示する o とき、カーソルをバッファリストに置いたままにする v
  • vi 風の j/k キーでカーソルを移動する

.xyzzy に次の記述をする。

(in-package "editor")

; 次のウィンドウのバッファを指定する(カーソルはもとのウィンドウにとどまる)
(defun set-buffer-other-window (buffer &optional nowarn)
  (interactive "BSwitch to buffer other window: " :default0 (other-buffer))
  (setq buffer (save-excursion (switch-to-buffer buffer nowarn)))
  (when (minibuffer-window-p (selected-window))
    (other-window))
  (when (= (count-windows) 1)
    (split-window))
  (let ((current-window (selected-window)))
    (set-window (next-window (selected-window) 'foo))
    (set-buffer buffer)
    (set-window current-window))
  buffer)

; 他のウィンドウのバッファを切り替えてバッファリストはそのまま
(defun buffer-menu-other-window-nofocus ()
  (interactive)
  (set-buffer-other-window (buffer-menu-buffname)))

(in-package "user")

(define-key ed::*buffer-menu-mode-map* #\v 'ed::buffer-menu-other-window-nofocus)

; vi 風のカーソル移動
(define-key ed::*buffer-menu-mode-map* #\j 'next-line)
(define-key ed::*buffer-menu-mode-map* #\k 'previous-line)