Last time I explained how I customised Magit to kill its buffers upon quitting
magit-status. My solution uses
magit-restore-window-configuration, which does
exactly what the name suggests. Wouldn’t it be great if a similar handy trick
could be applied to any Emacs functionality?
- I’d like to run some modes in a window that takes up the whole frame
- I’d like to quit them with the previous window configuration completely restored
Two modes that I use daily would definitely become more pleasant:
org-agenda-mode. Fortunately, the Emacs community has already devised
everything I need.
First, I have to save the current window configuration.
(defvar mu-saved-window-configuration nil) (defun mu-push-window-configuration () "Save current window configuration." (interactive) (push (current-window-configuration) mu-saved-window-configuration))
I can now create a command to open the desired mode.
(defun mu-ibuffer-open () "Open Ibuffer after storing current window configuration." (interactive) (mu-push-window-configuration) (ibuffer))
A buffer can be visited in a single window per frame with fullframe.
(with-eval-after-load 'ibuffer (fullframe ibuffer mu-pop-window-configuration))
The first argument to
fullframe indicates that I want the function
ibuffer to be
executed in a single window of the current frame. The second argument is the
command1 invoked when quitting Ibuffer, which will have to restore the
previous window configuration.
(defun mu-restore-window-configuration (config) "Kill current buffer and restore window configuration in CONFIG." (interactive) (kill-this-buffer) (set-window-configuration config)) (defun mu-pop-window-configuration () "Restore previous window configuration and clear current window." (interactive) (let ((config (pop mu-saved-window-configuration))) (if config (mu-restore-window-configuration config) (if (> (length (window-list)) 1) (delete-window) (bury-buffer)))))
These little functions are just my personal take on the awesome gems I discovered in John Wiegley’s Emacs configuration.
Nothing can stop me now from applying the same pattern to any mode I want. Once again, Emacs shows a degree of customizability second to none.
The symbol of a command, to be precise. ↩