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

Я использую 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 находится в правом окне?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Однако, это не кажется слишком сложным, чтобы взломать некоторый elisp для этого. Дьявол в деталях.

(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

Ответ 5

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

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

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

Ответ 6

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

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

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

m - окно подкачки (перемещение)

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

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

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

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

...

Итак, это будет S-w m

Ответ 8

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

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

Ответ 9

Здесь простой способ.

(defun flip-windows (&optional arg)
  "Flip two buffers"
  (interactive)
  (let* ((curr (current-buffer))
     (other (other-buffer curr t)))
(progn
  (switch-to-buffer other nil t)
  (switch-to-buffer-other-window curr))))

Когда у вас есть два открытых окна, поведение довольно очевидно. Если их больше двух, это может быть выбор "другого" буфера, который вы не ожидаете.

Ответ 10

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