Emacs users know their beloved editor has a penchant for throwing windows and buffers around. Smart Emacs users know how to make Emacs behave with a careful configuration of display-buffer-alist. For instance, I like to have all of my REPLs in a bottom side window, taking up half of the screen size.
(setq display-buffer-alist
`((,(rx bos (or "*cider-repl" ; CIDER REPL
"*intero" ; Intero REPL
"*idris-repl" ; Idris REPL
"*ielm" ; IELM REPL
"*SQL")) ; SQL REPL
(display-buffer-reuse-window display-buffer-in-side-window)
(side . bottom)
(reusable-frames . visible)
(window-height . 0.50))))
I then have a couple of custom functions, lifted from Sebastian Wiesner’s archived configuration, to quickly close the REPL and go back to the buffer I was editing.
(defun mu-find-side-windows (&optional side)
"Get all side window if any.
If SIDE is non-nil only get windows on that side."
(let (windows)
(walk-window-tree
(lambda (window)
(let ((window-side (window-parameter window 'window-side)))
(when (and window-side (or (not side) (eq window-side side)))
(push window windows)))))
windows))
;;;###autoload
(defun mu-quit-side-windows ()
"Quit side windows of the current frame."
(interactive)
(dolist (window (mu-find-side-windows))
(when (window-live-p window)
(quit-window nil window)
;; When the window is still live, delete it
(when (window-live-p window)
(delete-window window)))))
(bind-key "C-c w q" #'mu-quit-side-windows)
All of this usually works fine. However,
CIDER has recently introduced a new
session system which doesn’t play well with
this setup. Basically, using quit-window
on a CIDER REPL results in a buffer
without its related REPL available.
The solution is trivial.
;;;###autoload
(defun mu-hide-side-windows ()
"Hide side windows of the current frame."
(interactive)
(dolist (window (mu-find-side-windows))
(when (window-live-p window)
(delete-window window))))
(bind-key "C-c w h" #'mu-hide-side-windows)
Now I just hide the side windows of the current buffer, and the linked REPL is always a key binding away.
Notice that if you are only visiting one buffer and a REPL, pressing C-x 0 in the REPL window or C-x 1 in the buffer where the REPL window was opened has the same effect of C-c w h .