2009-11-21 2 views
78

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

Например: открыть 1 файл, используя Cx Cf file1.c RET

и я разделить кадр на два окна: Cx 3

я затем открыть другой файл Cx Cf file2.c RET

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

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

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

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

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

ответ

67

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

+0

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

+3

Если вы просто хотите обменять окна (независимо от выбранного), вы можете использовать следующие '(defun win-swap() «Переключить окна с использованием buffer-move.el» (интерактивный) (если (null (windmove-find-other-window 'справа)) (buf-move-left) (buf-move-right))) ' – mefiX

+0

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

0

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

9

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

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

+0

Я скопировал и вставил этот код, и он ничего не делает. – 2009-11-21 08:48:50

+0

О, извините, он что-то делает, он меняет верхнюю и нижнюю части окна Emacs. Я ожидал, что он заменит фреймы. – 2009-11-21 08:50:27

+0

ОК. Ты путаешь меня. вы упомянули C-x 3. Это должно создать 2 emacs окна, а не 2 emacs кадра. Используете ли вы рамки или окна? Что вы называете окнами и что вы называете кадрами? – Bahbar

25

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

M-хflop-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   |  |     |  | 
     +-------------------------+  +-----------------+-------+ 
+0

Это действительно хороший пакет, спасибо! –

+0

Доступен на [melpa] (http://melpa.org/#/). – TooTone

+1

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

10

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

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

+0

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

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

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

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

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

м - своп (перемещение) окна

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

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

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

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

...

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

0

В Новостях файле Emacs 26.1 существует следующая :

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

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

Смежные вопросы