Ответ 1
Я использую buffer-move для этого. Теперь, если вы работаете над буфером с левой стороны, вызов "buf-move-right" заменит его на правый. Я думаю, это то, что вы хотите.
Я использую 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
находится в правом окне?
Я использую buffer-move для этого. Теперь, если вы работаете над буфером с левой стороны, вызов "buf-move-right" заменит его на правый. Я думаю, это то, что вы хотите.
Библиотека 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 | | | |
+-------------------------+ +-----------------+-------+
Если вы используете Prelude, вы можете просто использовать C-c s
(prelude-swap-windows
). Из документации Prelude:
C-c s
запускает командуcrux-swap-windows
(находится вprelude-mode-map
), который является псевдонимом дляcrux-transpose-windows
в crux.el.
Я не знаю никакой встроенной функции, выполняющей это.
Однако, это не кажется слишком сложным, чтобы взломать некоторый 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 NEWS есть следующая запись:
+++
*** New command 'window-swap-states' swaps the states of two live
windows.
Который, кажется, предлагает аналогичную функциональность для crux-transpose-windows
но также может сделать некоторые транспозиции высоты/ширины?
Если у вас есть прелюдия, вы можете использовать ace-window с S-w
. Оттуда вы можете сделать много вещей, перечисленных в их docs.
Вы также можете начать с вызова ace-window, а затем решить переключить действие для удаления или замены и т.д. По умолчанию привязки:
x - удалить окно
m - окно подкачки (перемещение)
c - разбивать окно справедливо, вертикально или горизонтально
v - разбиение окна по вертикали
b - разбиение окна по горизонтали
n - выберите предыдущее окно
...
Итак, это будет S-w m
Это также работает (проверено в emacs24): Транспонирование двух буферов
Кажется похожим на ответ Bahbar
Следующий фрагмент кода может выполнять буфер переключения.
(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"))
Здесь простой способ.
(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))))
Когда у вас есть два открытых окна, поведение довольно очевидно. Если их больше двух, это может быть выбор "другого" буфера, который вы не ожидаете.
Я бы попытался открыть файл # 2 в нужном месте, т.е. после того, как вы нажмете c-x 3, переместите курсор с помощью c-x o перед тем, как перейти ко второму файлу.