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



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



например:
Я открываю 1 файл с помощью C-x C-f file1.c RET



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



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



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

635   8  

8 ответов:

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

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

M-xflop-frameRET делает то, что этот конкретный вопрос нуждается.

следующие диаграммы взяты из комментария в библиотеке (и ее странице 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            |      |                 |       |
       +-------------------------+      +-----------------+-------+

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

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

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

однако, это не кажется слишком сложным, чтобы на скорую руку некоторые 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

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

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

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

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

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

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

M-swap (move) window

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

в - Сплит окно вертикально

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

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

...

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

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

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

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

Comments

    Ничего не найдено.