Ibufferのバッファリストに表示する項目を追加する

バッファリストを表示するツールとしてIbuffer Modeが存在する. カスタマイズするとなかなか便利に使えるツールである.

デフォルトで表示可能な項目にはバッファ名やメジャーモード名などがある. 私はこれらに加えて,各バッファの行数を表示したいと考えた.

ちょっと調べて試行錯誤した結果,以下のようにすればよいことが分かった.

  1. define-ibuffer-columnを用いて表示用の関数を定義
  2. ibuffer-formatsに追加

Emacs Wikiをみると,他にもバッファのサイズ表示をhuman-readableにするというものが紹介されていたので,今回はそれも取り込んでみた:

;; number of rows
(define-ibuffer-column row
    (:name "Rows" :inline t)
    (format "%5d" (count-lines (point-min) (point-max))))

;; human readable size
(define-ibuffer-column size-h
    (:name "Size" :inline t)
    (cond
     ((> (buffer-size) 1000000) (format "%7.1fM" (/ (buffer-size) 1000000.0)))
     ((> (buffer-size) 1000) (format "%7.1fk" (/ (buffer-size) 1000.0)))
     (t (format "%8d" (buffer-size)))))

(setq ibuffer-formats '((mark modified read-only
                              " " (name 30 40 :left :elide)
                              " " (size-h 9 -1 :right)  ;modified
                              " " (row 5 -1 :right)     ;modified
                              " " (mode 16 16 :left :elide)
                              " " filename-and-process)
                        (mark " " (name 16 -1)
                              " " filename)))

ibuffer-formatsの詳細についてはinfoを参考にしてもらえばいい訳だが, ここではnameやrowの後ろに続く数字が表示文字数の最小値・最大値を表しており, -1が限界なしということだけ付記しておく.