Emacs: Custom columns for Ibuffer
Emacs 23.2 is out! To celebrate, I'll write (yet) another Emacs post. Please forgive the fact that the content has nothing to do with version 23.2 in particular (you can read about all new stuff in the NEWS file (C-h n)).
I'm very fond of the Ibuffer package. It lists all your buffers, and allows you to sort, filter, and group them as you please. You can operate on multiple buffers by marking a subset and then calling a command (think "delete" or "replace-regexp"). Amazing! Ibuffer's got it all.
I was reading Ibuffer's source to see if I could add my own
information to the buffer listing. Specifically, I wanted to
indicate that a file was part of my "project" (as defined
by mk-project). Ibuffer
did not disappoint. It was trivial to create a new custom column with
In the "screenshot" below, I have a mk-project defined which includes all the files in my ~/elisp directory. You'll see a "p" next to each of these files.
MRP Name Size Mode Filename/Process --- ---- ---- ---- ---------------- [ Default ] z.clj 2210 Clojure ~/z.clj tmp.txt 2915 Text ~/tmp.txt p projects.el 3127 Emacs-Lisp ~/elisp/projects.el p mk-utils.el 9968 Emacs-Lisp ~/elisp/mk-utils.el p basic.el 7245 Emacs-Lisp ~/elisp/basic.el ...
In the code below, I create a column
mk-proj-col, the column heading of which is simply
"P", and if a particular buffer is a part of my project, it will print
"p" next to it.
(defun mk/proj-buffer-p (b) "Is the buffer `b' part of the project?" (and mk-proj-name (or (mk-proj-buffer-p b) (string= (buffer-name b) mk-proj-fib-name) (string= (buffer-file-name b) mk-proj-tags-file)))) (define-ibuffer-column mk-proj-col (:name "P") (if (mk/proj-buffer-p buffer) "p" "")) ;; Define 3 formats, each including the new mk-proj-col ;; column. Switch formats with ibuffer-switch-format (bound to "`"). (setq ibuffer-formats '((mark modified read-only (mk-proj-col 2 2 :left :elide) " " (name 30 30 :left :elide) " " (size 9 -1 :right) " " (mode 16 16 :left :elide) " " filename-and-process) (mark modified read-only (mk-proj-col 2 2 :left :elide) " " (name 45 -1 :left) " " filename-and-process) (mark modified read-only (mk-proj-col 2 2 :left :elide) " " filename-and-process)))
And it was even easier to define a filter command that displays just the files in my project.
(define-ibuffer-filter project "Toggle current view to buffers in the defined mk-project." (:description "mk-project") (mk/proj-buffer-p buf)) (define-key ibuffer-mode-map (kbd "/ k") 'ibuffer-filter-by-project)