Last time I refactored my windows restoring
configuration in order to pass the prefix argument around. This is a nice
solution to leverage my wrappers for commands like shell
, but I can push it a
little further.
I have already discussed a couple of functions to restore my windows configuration when I exit a fullframed buffer.
(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)))))
However, with these functions the buffer I am leaving gets killed. This is fine when moving away from, say, Ibuffer or Paradox, but it’s less than optimal for shell buffers which may be running a long-run process.
Once again, the prefix argument can help:
(defun mu--restore-window-configuration (config &optional bury-buffer)
"Kill current buffer and restore the window configuration in CONFIG.
With BURY-BUFFER bury the buffer instead of killing it."
(if bury-buffer
(bury-buffer)
(kill-this-buffer))
(set-window-configuration config))
(defun mu-pop-window-configuration (&optional bury-buffer)
"Restore the previous window configuration and clear current window.
With BURY-BUFFER bury the buffer instead of killing it."
(interactive "P")
(let ((config (pop mu--saved-window-configuration)))
(if config
(mu--restore-window-configuration config bury-buffer)
(if (> (length (window-list)) 1)
(delete-window)
(bury-buffer)))))
Now that the functions can make use of the prefix argument, I just need to call them properly from a shell buffer:
(defun mu-shell-bury ()
"Bury the shell window."
(interactive)
(let ((current-prefix-arg 4))
(call-interactively #'mu-pop-window-configuration)))
I’ve bound this to C-c C-q
, so I can still kill a shell buffer
using C-x k
(kill-this-buffer
in my configuration) if needed.