tags:

views:

206

answers:

2

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

+5  A: 

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

docgnome
I just saw Stevey's post as well:)
chollida
+2  A: 

The following version works with any number of windows. When there are more than two windows, repeated invocations will make the selected buffer appear in each windows successively.

(defun swap-buffer ()
  (interactive)
  (cond ((one-window-p) (display-buffer (other-buffer)))
        ((let* ((buffer-a (current-buffer))
                (window-b (cadr (window-list)))
                (buffer-b (window-buffer window-b)))
           (set-window-buffer window-b buffer-a)
           (switch-to-buffer buffer-b)
           (other-window 1)))))
huaiyuan