Buffer List を現在のウィンドウで開く

常にウィンドウを分割して表示していると、buffer list を表示するたびに次のウィンドウへカーソルが移動してしまい不便だ。そこで xyzzy に添付されている lisp/buf-menu.l で定義されている関数 list-buffer を改造したものを用意した。

追加の設定も載せておく。

(in-package "editor")

; ウィンドウを分割しない buffer-menu
(defun list-buffers-sw (&optional file-only)
  (interactive "p")
  (let ((selected (selected-buffer)))
    (with-output-to-temp-buffer ("*Buffer List*" nil)
      (switch-to-buffer "*Buffer List*")
      (let ((tmp (selected-buffer)))
	(princ " MR Buffer            Size    Line  Mode          File\n")
	(princ " -- ------            ----    ----  ----          ----\n")
	(dolist (buffer (buffer-list))
	  (when (not (eq buffer tmp))
	    (let ((bufname (buffer-name buffer))
		  (filename (get-buffer-file-name buffer)))
	      (unless (or (string= bufname " " :end1 1)
			  (and (null filename) file-only))
		(let ((size (buffer-size buffer))
		      (lines (buffer-lines buffer)))
		  (format t "~:[ ~;.~]~:[ ~;*~]~:[ ~;%~] ~A~VT ~D~VT ~D~35T ~A~:[~;~49T ~:*~A~]~%"
			  (eq buffer selected)
			  (buffer-modified-p buffer)
			  (buffer-local-value buffer 'buffer-read-only)
			  bufname
			  (- 24 (if (zerop size) 0 (floor (log size 10)))) size
			  (- 32 (if (zerop lines) 0 (floor (log lines 10)))) lines
			  (buffer-local-value buffer 'mode-name)
			  filename)))))))
      (goto-line 3)
      (buffer-menu-mode))))

(in-package "user")
(define-key ctl-x-map #\C-b 'ed::list-buffers-sw)

; q で閉じる
(define-key ed::*buffer-menu-mode-map* #\q 'kill-selected-buffer)

; Enter で開く
(define-key ed::*buffer-menu-mode-map* #\RET 'ed::buffer-menu-this-window)