It’s been a while since I posted here – not because I have nothing to write about (after all, the world is full of interesting stuff!), but because of lack of time. Today I decided to share a little Elisp hack. I’m tired of pressing C-x C-b RET
to switch between two buffers I’m working on (and I don’t want to have two windows open very often on a small netbook). Also, I’m tired of accidentally hitting C-z
(OK, that does not happen very often, but still – C-z
is basically useless, especially that C-x C-z
does the same). Anyway, I decided to do something about it. Here’s what I have now in my init.el
:
(define-prefix-command 'ctl-z-map) (global-set-key (kbd "C-z") 'ctl-z-map) (global-set-key (kbd "C-z C-c") 'compile) (global-set-key (kbd "C-z C-b") 'switch-bury-or-kill-buffer) (defun switch-bury-or-kill-buffer (&optional aggr) "With no argument, switch (but unlike C-x b, without the need to confirm). With C-u, bury current buffer. With double C-u, kill it (unless it's modified)." (interactive "P") (cond ((eq aggr nil) (switch-to-buffer (other-buffer))) ((equal aggr '(4)) (bury-buffer)) ((equal aggr '(16)) (kill-buffer-if-not-modified (current-buffer)))))
(BTW, this also binds compile
to C-z C-c
.) Now I can press C-z C-b
to switch to the other-buffer
(so basically, I can easily cycle between the last two buffers), C-u C-z C-b
to bury the current buffer (very useful, especially when clocking in Org-mode, for instance), and C-u C-u C-z C-b
to kill the current buffer (but only if it’s not modified).
Note also that I had a problem with naming the argument to switch-bury-or-kill-buffer
. Finally, I decided that “aggr
” (as in “aggressiveness”) is a good idea: the least aggressive variant (no prefix argument) just punches the current buffer a bit, so that it falls behind the next one; the more aggressive one punches it stronger, so that it falls at the end of the buffer list; and the strongest one just kills it.