Як поміняти буфери в 2 вікнах emacs


98

Я використовую emacs. Я вважаю, що іноді у мене є два файли, розділені на 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

переміщення буфера не працювало для мене з компонуванням всього двох вікон, але з win-swapним спрацювало чудово, дякую!
dolzenko

1
Усередині цього джерела буфера переміщення ви побачите коментар про всі важливі відображень для C-S-upдо і так buf-move-upдалі
Михей Elliott

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 NEWS є такий запис:

+++
*** 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 .


прелюдія схожа на горла (і вона ніде не упакована - 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. Ви використовуєте рамки чи вікна? Як ви називаєте вікна та як називаєте кадри?
Бахбар

також ви не говорили про верхню та нижню частини. У вас одразу більше двох буферів?
Бахбар

Я не та людина, яка задала питання, я просто інтерлопер. Я ніколи не використовував Cx 3, перш ніж бачив це питання, але, як ви кажете, він розбиває вікно Emacs, а не створює новий кадр.

1

Якщо у вас є прелюдія, ви можете використовувати ас-вікно з S-w. Звідти ви можете зробити багато речей, перелічених у їхніх документах .

Ви також можете почати, зателефонувавши у вікно ace, а потім вирішіть переключити дію на видалення або поміщення тощо.

х - видалити вікно

m - вікно swap (переміщення)

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.