Using Emacs 36 - A Touch of Elisp

# COMMENTS

I've been working on a vue.js project this summer. During the school year I really can't dive into code so it's been fun.

I've already showed you most of the Emacs tools I use for development. Projectile, Ace-Window, IBuffer, Swiper / Ivy and all. One thing I couldn't easily do was arrange windows the way I wanted.

I've been setting up Emacs with one large window and a couple of smaller ones:

+----------------------------------+------------+
|                                  |            |
|                                  |  B         |
|                                  |            |
|                                  |            |
|    A                             +------------+
|                                  |            |
|                                  |     C      |
|                                  |            |
|                                  |            |
|                                  |            |
+----------------------------------+------------+

../files/img/touch-elisp.png

/img/touch-elisp.png

I can easily switch the buffer in the window and I can easily switch windows but what I wanted to do was swap the buffer in the large window with one of the smaller buffers and leave focus in the larger buffer:

+----------------------------------+------------+
|                                  |            |
|                                  |  A         |
|                                  |            |
|                                  |            |
|    B                             +------------+
|                                  |            |
|                                  |     C      |
|                                  |            |
|                                  |            |
|                                  |            |
+----------------------------------+------------+

../files/img/touch-elisp2.png

/img/touch-elisp2.png

I started looking at perspective mode and persp mode but neither work with the latest Emacs. After poking around at other packages I realized that ace-window does most of what I wanted. Ace-window has a function that swaps the buffers in two windows named ~ace-swap-window~. The only problem is that it leaves the focus on the window you swap to not the one you started in. Ace-window also has ~aw-flip-window~ which then returns the cursor to the previous window.

With a little elisp, we get the behavior I was looking for which I then bound to ~C-1 z~:

(defun z/swap-windowsn ()
""
(interactive)
(ace-swap-window)
(aw-flip-window)
)

(define-key z-map (kbd "w") 'z/swap-windows)

The video goes into more details but it shows that if you're not afraid to explore a bit you can pretty much get Emacs to do whatever you want.