Emacs のウィンドウやフレームをグルグル入れ替える

生産性向上のため複数のモニタを使用している.そして各モニタに Emacs のフレームをおいて,各フレーム複数のウィンドを開くことがあるのだが,それらの内容を入れ替えたいことがある.

例えば,フレーム毎にタスクを分けることがある.このフレームは org-mode で文書作成とアジェンダビュー,別のフレームはソースコードと対話的実行環境でコーディングと感じである.このときコーディングしているバッファで org ファイルを開いて文書作成に移ると別ウィンドウが対話的実行環境のままで,何かイケてない.

別フレームにフォーカスを移動しても( other-frame しても )良いのだが,モニタを3枚使用していると同時に2枚しか見ることができず,どうも3枚目にフォーカスを移動するのは首の負担的にツライ(短時間であったり,サブディスプレイ的使用は問題なくできるのだが).

具体的に何がしたいかは,例えば次のようなウィンドウの内容,フレームの内容移動がしたい.

フレームの内容を入れ替えたい.

cycle-frames.gif

フレーム内のウィンドウを入れ替えたい.

cycle-windows.gif

ウィンドウをフレーム跨ぎグルグル動かしたい.

cycle-multiframe-windows.gif

こういう動作を実現する emacs lisp くらい Internet に転がっているだろうとタカをくくっていた.しかし,いざ Google で検索してみると中々発見できなかったり,発見しても微妙に動作が希望のもとと違っていたりして結局自分で emacs lisp を書くことにした.

何気に lisp をマジメに使う初めてだったが, info とか google とかを使い何とか希望通りの動作を実現することができた.リスト操作関数 -zip-with を使っているので原理的にはウィンドウやフレームがいくつあっても動作する(はず).