Como trocar os buffers em 2 windows emacs


98

Estou usando o emacs e acho que às vezes tenho 2 arquivos separados em 2 janelas.

Por exemplo: abro 1 arquivo usando C-x C-f file1.c RET

e eu divido a moldura em duas janelas: C-x 3

Eu então abro outro arquivo C-x C-f file2.c RET

Portanto, tenho 2 arquivos:

janela 1 (esquerda) file1.c

janela 2 (direita) file2.c

Eu estou me perguntando se existe alguma combinação de teclas para trocar os arquivos? Normalmente gosto de trabalhar na janela esquerda quando tenho 2 janelas. Eu sei que posso fazer facilmente C-x omover o cursor para a janela certa.

No entanto, só estou me perguntando se posso trocar os arquivos para que file2.cfiquem na janela da esquerda e file1.cna janela da direita?


Isso também funciona (testado em emacs24): transposição dois buffers Parece semelhante ao Bahbar resposta
nephewtom

Respostas:


88

Eu uso buffer-move para isso. Agora, se você estiver trabalhando no buffer do lado esquerdo, chamar 'buf-move-right' irá trocá-lo com o da direita. Eu acho que é isso que você quer.


Esta solução é perfeita e os comentários são muito claros - apenas certifique-se de lê-los :)
Martin Clarke

3
Se você deseja apenas trocar de janelas (independente da selecionada), você pode usar o seguinte(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
mefiX

buffer-move não funcionou para mim com o layout de apenas duas janelas, mas com win-swapele funcionou muito bem, obrigado!
dolzenko

1
Dentro dessa fonte tampão-movimento que você vai ver um comentário sobre os mapeamentos de suma importância para C-S-upa buf-move-upetc
Micah Elliott

34

A biblioteca transpose-frame fornece um conjunto bastante abrangente de funções para inverter ou girar os arranjos de janela em frames.

M-x flop-frame RET faz o que esta questão em particular precisa.

Os seguintes diagramas são do comentário na biblioteca (e sua página 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-framefunciona apenas quando a divisão entre as janelas é vertical, para divisão horizontal que você precisa flip-frame. No entanto, rotate-framefunciona de forma independente; um comando para trocar os buffers entre duas janelas, não importa qual seja a orientação da divisão :)
legends2k

33

No arquivo Emacs 26.1 NEWS, há a seguinte entrada:

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

Que parece oferecer funcionalidade semelhante, crux-transpose-windowsmas também pode fazer algumas transposições de altura / largura?


Sim, funciona. Eu tenho Emacs> 26,1. M-x window-swap-statestrocou os buffers entre as duas janelas.
Samrat Debroy

15

Se você estiver usando o Prelude, pode apenas usar C-c s( prelude-swap-windows). Da documentação do Prelúdio:

C-c sexecuta o comando crux-swap-windows(encontrado no prelude-mode-map), que é uma abreviatura para crux-transpose-windowsem crux.el .


prelúdio parece um bocado (e não está embalado em nenhum lugar - curl | sh= wtf?), mas crux com certeza parece bom e faz um monte de coisas que fiz sozinho em primeiro lugar.
anarcat

eu sei o que curl | shé, o que estou dizendo é: é mal.
anarcat

11

Não estou ciente de nenhuma função interna fazendo isso.

No entanto, não parece muito difícil conseguir algumas elisp para fazer isso. Mas o diabo está nos detalhes.

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

Notavelmente, isso pode não estar fazendo o que você deseja em relação a onde o cursor termina. No entanto, você primeiro tem que dizer o que deseja: p


Copiei e colei este código e ele parece não fazer nada.

Oh, desculpe, ele faz alguma coisa, ele troca as partes superior e inferior da janela do Emacs. Eu estava esperando que ele trocasse as molduras.

Está bem. Você está me confundindo. você mencionou Cx 3. Isso é para criar 2 janelas emacs, não 2 quadros emacs. Você está usando molduras ou janelas? O que você chama de windows e o que você chama de frames?
Bahbar

além disso, você não falou sobre as partes superior e inferior. Você tem mais de 2 buffers exibidos ao mesmo tempo?
Bahbar

Não sou a pessoa que fez a pergunta, sou apenas um intruso. Eu nunca tinha usado o Cx 3 antes de ver essa pergunta, mas como você diz, ela divide a janela do Emacs, ao invés de criar um novo quadro.

1

Se você tiver o prelúdio, poderá usar o ace-window com S-w. A partir daí, você pode fazer muitas coisas listadas em seus documentos .

Você também pode começar chamando ace-window e depois decidir mudar a ação para excluir ou trocar etc. Por padrão, as ligações são:

x - excluir janela

m - janela de troca (mover)

c - dividir a janela de maneira justa, tanto vertical quanto horizontalmente

v - dividir janela verticalmente

b - dividir a janela horizontalmente

n - selecione a janela anterior

...

Então seria S-w m


Para usuários do Spacemacs, ace-swap-windowestá vinculado a SPC w M. Esta funcionalidade está disponível por padrão.
Claudio

0

O seguinte trecho de código pode fazer a troca de buffer.

(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

Eu daria um jeito de abrir o arquivo # 2 no local desejado, ou seja, depois de pressionar cx 3, mova o cursor com cx o antes de navegar para o segundo arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.