Как поменять местами буферы в 2 окнах emacs


98

Я использую emacs. Я обнаружил, что иногда у меня есть 2 файла, разделенных на 2 окна.

Например: я открываю 1 файл, используя C-x C-f file1.c RET

и я разделил фрейм на два окна: C-x 3

Затем я открываю другой файл C-x C-f file2.c RET

Итак, у меня есть 2 файла:

окно 1 (слева) file1.c

окно 2 (справа) file2.c

Мне интересно, есть ли какая-нибудь комбинация клавиш для обмена файлами? Обычно мне нравится работать с левым окном, когда у меня есть 2 окна. Я знаю, что могу легко C-x oпереместить курсор в правое окно.

Однако мне просто интересно, могу ли я поменять файлы местами, чтобы они находились file2.cв левом окне и file1.cв правом окне?


Это также работает (проверено в emacs24): транспонирование Два Буферы кажется похож на Bahbar ответ
nephewtom

Ответы:


88

Я использую для этого буферный ход . Теперь, если вы работаете с буфером с левой стороны, вызов «buf-move-right» заменит его буфером справа. Я думаю, это то, что ты хочешь.


Это идеальное решение, и комментарии очень четкие - просто убедитесь, что вы их прочитали :)
Мартин Кларк,

3
Если вы просто хотите поменять местами окна (независимо от выбранного), вы можете использовать следующее(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
mefiX

buffer-move у меня не работал с макетом всего двух окон, но с win-swapним работал нормально, спасибо!
dolzenko 02

1
Внутри этого источника перемещения буфера вы увидите комментарий о важнейших сопоставлениях для C-S-upи buf-move-upт. Д.
Мика Эллиотт,

34

Библиотека транспонирования кадров предоставляет довольно полный набор функций для переворачивания или поворота расположения окон в кадрах.

M-x flop-frame RET делает то, что нужно для этого конкретного вопроса.

Следующие диаграммы взяты из комментария в библиотеке (и на ее странице EmacsWiki):

transpose-frame  Swap x-direction and y-direction

       +------------+------------+      +----------------+--------+
       |            |     B      |      |        A       |        |
       |     A      +------------+      |                |        |
       |            |     C      |  =>  +--------+-------+   D    |
       +------------+------------+      |   B    |   C   |        |
       |            D            |      |        |       |        |
       +-------------------------+      +--------+-------+--------+

flip-frame  Flip vertically

       +------------+------------+      +------------+------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |            |     C      |
       +------------+------------+      |     A      +------------+
       |            D            |      |            |     B      |
       +-------------------------+      +------------+------------+

flop-frame  Flop horizontally

       +------------+------------+      +------------+------------+
       |            |     B      |      |     B      |            |
       |     A      +------------+      +------------+     A      |
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+------------+
       |            D            |      |            D            |
       +-------------------------+      +-------------------------+

rotate-frame  Rotate 180 degrees

       +------------+------------+      +-------------------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+     A      |
       |            D            |      |     B      |            |
       +-------------------------+      +------------+------------+

rotate-frame-clockwise  Rotate 90 degrees clockwise

       +------------+------------+      +-------+-----------------+
       |            |     B      |      |       |        A        |
       |     A      +------------+      |       |                 |
       |            |     C      |  =>  |   D   +--------+--------+
       +------------+------------+      |       |   B    |   C    |
       |            D            |      |       |        |        |
       +-------------------------+      +-------+--------+--------+

rotate-frame-anti-clockwise  Rotate 90 degrees anti-clockwise

       +------------+------------+      +--------+--------+-------+
       |            |     B      |      |   B    |   C    |       |
       |     A      +------------+      |        |        |       |
       |            |     C      |  =>  +--------+--------+   D   |
       +------------+------------+      |        A        |       |
       |            D            |      |                 |       |
       +-------------------------+      +-----------------+-------+

2
flop-frameработает только при вертикальном разделении окон, для горизонтального разделения необходимо flip-frame. Однако rotate-frameработает независимо; одна команда для переключения буферов между двумя окнами, независимо от ориентации разделения :)
legends2k

33

В файле новостей Emacs 26.1 есть следующая запись:

+++
*** New command 'window-swap-states' swaps the states of two live
windows.

Что, похоже, предлагает аналогичные функции, crux-transpose-windowsно также может выполнять некоторые транспозиции высоты / ширины?


Да, это работает. У меня Emacs> 26.1. M-x window-swap-statesпоменял местами буферы между двумя окнами.
Самрат Деброй,

15

Если вы используете Prelude, вы можете просто использовать C-c s( prelude-swap-windows). Из документации Prelude:

C-c sзапускает команду crux-swap-windows(найденный в prelude-mode-map), который является псевдонимом crux-transpose-windowsв crux.el .


prelude выглядит полным ртом (и он нигде не упакован - curl | sh= wtf?), но суть действительно выглядит красиво и делает кучу вещей, которые я накатал сам.
anarcat

Я знаю, что curl | shесть, я говорю: это зло.
anarcat

11

Я не знаю ни одной встроенной функции, делающей это.

Тем не менее, это не кажется слишком сложным, чтобы придумать немного элиспа для этого. Но дьявол кроется в деталях.

(defun swap-buffers-in-windows ()
  "Put the buffer from the selected window in next window, and vice versa"
  (interactive)
  (let* ((this (selected-window))
     (other (next-window))
     (this-buffer (window-buffer this))
     (other-buffer (window-buffer other)))
    (set-window-buffer other this-buffer)
    (set-window-buffer this other-buffer)
    )
  )

Примечательно, что это может не делать то, что вы хотите, в отношении того, где заканчивается курсор. Однако сначала вам нужно сказать, что вы хотите: p


Я скопировал и вставил этот код, и, похоже, он ничего не делает.

Ой, извините, он что-то делает, он меняет местами верхнюю и нижнюю части окна Emacs. Я ожидал, что он поменяет рамки.

хорошо. Ты путаешь меня. вы упомянули Cx 3. Это для создания 2 окон emacs, а не 2 фреймов emacs. Вы используете рамы или окна? Что вы называете окнами и рамками?
Bahbar

Кроме того, вы не говорили о верхней и нижней частях. У вас одновременно отображается более 2 буферов?
Bahbar

Я не тот человек, который задал вопрос, я просто нарушитель. Я никогда не использовал Cx 3 до того, как увидел этот вопрос, но, как вы говорите, он разбивает окно Emacs, а не создает новый фрейм.

1

Если у вас есть прелюдия, вы можете использовать ace-window с S-w. Оттуда вы можете делать многие вещи, перечисленные в их документации .

Вы также можете начать с вызова ace-window, а затем решить переключить действие на удаление или обмен и т. Д. По умолчанию привязки следующие:

x - удалить окно

m - поменять (переместить) окно

c - разделить окно справедливо по вертикали или горизонтали

v - разделить окно по вертикали

б - разделить окно по горизонтали

n - выбрать предыдущее окно

...

Так было бы S-w m


Для пользователей Spacemacs ace-swap-windowобязательно SPC w M. Эта функция доступна по умолчанию.
Клаудио

0

Следующий фрагмент кода может переключать буфер.

(defun ab/switch-buffer-each-other (arg)
  "switch current buffer with other window buffer 
   right-2-left and up-2-down"
  (interactive "p")
  (cond
   ((windmove-find-other-window 'right) (buf-move-right))
   ((windmove-find-other-window 'left) (buf-move-left))
   ((windmove-find-other-window 'up) (buf-move-up))
   ((windmove-find-other-window 'down) (buf-move-down)))
(message "switch buffer done"))

-1

Я бы умудрился открыть файл №2 в желаемом месте, т.е. после того, как вы нажмете cx 3, переместите курсор с помощью cx o перед переходом ко второму файлу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.