With emacs, How to swap the position of 2 windows

emacs

I've got 2 windows open in Emacs and I'd like to swap their positions.

Ie Consider having a REPL above the source file and I'd like to swap their locations so that the REPL is below the source file.

I'd also like to preserve the sizes of the windows

Best Answer

I shamelessly stole this from Steve Yegge's .emacs

(defun swap-windows ()
  "If you have 2 windows, it swaps them." 
  (interactive)
  (cond ((not (= (count-windows) 2)) (message "You need exactly 2 windows to do this."))
        (t
         (let* ((w1 (first (window-list)))
                (w2 (second (window-list)))
                (b1 (window-buffer w1))
                (b2 (window-buffer w2))
                (s1 (window-start w1))
                (s2 (window-start w2)))
           (set-window-buffer w1 b2)
           (set-window-buffer w2 b1)
           (set-window-start w1 s2)
           (set-window-start w2 s1)))))

Tested on Emacs 23.1.1 on Gentoo. This does preserve window sizes.

I also found this which is a little cleaner.

(defun transpose-windows ()
  (interactive)
  (let ((this-buffer (window-buffer (selected-window)))
        (other-buffer (prog2
                          (other-window +1)
                          (window-buffer (selected-window))
                        (other-window -1))))
    (switch-to-buffer other-buffer)
    (switch-to-buffer-other-window this-buffer)
    (other-window -1)))

Also tested on Emacs 23.1.1