Переключити роздільну орієнтацію вікна, найшвидший спосіб


16

Скажіть, у вас відкриті два буфери так:

------------------------------------
            |                      |
  buffer 1  |        buffer 2      |       
            |                      |
------------------------------------

Який найшвидший спосіб переключити буфери, щоб отримати це:

------------------------------------
           buffer 1                |
                                   |
------------------------------------
            buffer 2               |
                                   |
------------------------------------

stackoverflow.com/a/10546694 . transpose-frame library. Відмова від відповідальності - не пробували.
Faheem Mitha

На цю тему є вікі-сторінка: emacswiki.org/emacs/ToggleWindowSplit
Кріс Мартін

Дивіться emacs.stackexchange.com/q/5371 ; зокрема, одна відповідь згадується transpose-frameпро MELPA.
TooTone

Відповіді:


16

Ось розбір, який би робив те, що ви шукаєте:

(defun toggle-window-split ()
  (interactive)
  (if (= (count-windows) 2)
      (let* ((this-win-buffer (window-buffer))
             (next-win-buffer (window-buffer (next-window)))
             (this-win-edges (window-edges (selected-window)))
             (next-win-edges (window-edges (next-window)))
             (this-win-2nd (not (and (<= (car this-win-edges)
                                         (car next-win-edges))
                                     (<= (cadr this-win-edges)
                                         (cadr next-win-edges)))))
             (splitter
              (if (= (car this-win-edges)
                     (car (window-edges (next-window))))
                  'split-window-horizontally
                'split-window-vertically)))
        (delete-other-windows)
        (let ((first-win (selected-window)))
          (funcall splitter)
          (if this-win-2nd (other-window 1))
          (set-window-buffer (selected-window) this-win-buffer)
          (set-window-buffer (next-window) next-win-buffer)
          (select-window first-win)
          (if this-win-2nd (other-window 1))))))

(Безсоромно копіюється з Magnars .emacs.d )

Плюс якщо ви зателефонуєте ще раз, він повторно розділить ваші вікна у вихідній вертикальній орієнтації.


Було б непогано, якби це могло зберегти відносні розміри двох вікон. Я часто зберігаю нерівномірне "коротке" вікно внизу, і при перемиканні вперед і назад було б корисно зберегти цей відносний розмір. Хоча вузьке вертикальне вікно, напевно, менш корисне.
b4hand

1
Я не можу сказати, скільки разів я цим користуюся. Так корисно.
Едгар Аротьоуніан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.