Переключить ориентацию разделения окна, самый быстрый способ

16

Допустим, у вас есть два открытых буфера:

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

Какой самый быстрый способ переключения буферов, чтобы вы получили это:

------------------------------------
           buffer 1                |
                                   |
------------------------------------
            buffer 2               |
                                   |
------------------------------------
Эдгар Арутюнян
источник
stackoverflow.com/a/10546694 . библиотека транспонированных кадров. Отказ от ответственности - не пробовал.
Фахим Митха
На эту тему есть вики-страница: emacswiki.org/emacs/ToggleWindowSplit
Крис Мартин,
См. Emacs.stackexchange.com/q/5371 ; в частности, один ответ упоминает transpose-frameо MELPA.
TooTone

Ответы:

15

Вот определение, которое будет делать то, что вы ищете:

(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 )

Кроме того, если вы позвоните еще раз, ваши окна будут заново разделены в исходной вертикальной ориентации.

waymondo
источник
Было бы хорошо, если бы это могло сохранить отношение относительного размера двух окон. Я часто держу неровное «короткое» окно внизу, и при переключении назад и вперед было бы полезно сохранить этот относительный размер. Хотя узкое вертикальное окно, вероятно, менее полезно.
b4hand
1
Я не могу сказать вам, сколько раз я использую это. Так полезно.
Эдгар Арутюнян