Come scambiare i buffer in 2 windows emacs


98

Sto usando emacs, trovo che a volte ho 2 file separati in 2 finestre.

Ad esempio: apro 1 file usando C-x C-f file1.c RET

e ho diviso la cornice in due finestre: C-x 3

Quindi apro un altro file C-x C-f file2.c RET

Quindi ho 2 file:

finestra 1 (sinistra) file1.c

finestra 2 (destra) file2.c

Mi chiedo se esiste una combinazione di tasti per scambiare i file? Normalmente mi piace lavorare sulla finestra di sinistra quando ho 2 finestre. So che posso facilmente C-x ospostare il cursore nella finestra di destra.

Tuttavia, mi chiedo solo se posso scambiare i file in modo che file2.csiano nella finestra di sinistra e file1.cnella finestra di destra?


Funziona anche (testato in emacs24): Trasposizione di due tamponi Sembra simile alla risposta di
Bahbar

Risposte:


88

Uso il movimento del buffer per questo. Ora se stai lavorando sul buffer sul lato sinistro, chiamando 'buf-move-right' lo scambierà con quello a destra. Immagino sia quello che vuoi.


Questa soluzione è perfetta ei commenti sono molto chiari - assicurati solo di leggerli :)
Martin Clarke,

3
Se vuoi solo scambiare le finestre (indipendentemente da quella selezionata), puoi usare quanto segue(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 non ha funzionato per me con il layout di due sole finestre, ma win-swapha funzionato bene, grazie!
dolzenko

1
All'interno di quella fonte di buffer-move vedrete un commento circa le mappature tutto-importante per C-S-upa buf-move-up, ecc
Micah Elliott

34

La libreria Transpose-frame fornisce un insieme piuttosto completo di funzioni per capovolgere o ruotare le disposizioni delle finestre in frame.

M-x flop-frame RET fa ciò di cui ha bisogno questa particolare domanda.

I seguenti diagrammi sono tratti dal commento nella libreria (e dalla sua pagina 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-framefunziona solo quando la divisione tra le finestre è verticale, per la divisione orizzontale è necessario flip-frame. Tuttavia, rotate-framefunziona indipendentemente; un comando per scambiare i buffer tra due finestre, indipendentemente dall'orientamento della divisione :)
legends2k

33

Nel file Emacs 26.1 NEWS c'è la seguente voce:

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

Quale sembra offrire funzionalità simili crux-transpose-windowsma può anche eseguire alcune trasposizioni altezza / larghezza?


Sì, funziona. Ho Emacs> 26.1. M-x window-swap-statesha scambiato i buffer tra le due finestre.
Samrat Debroy

15

Se stai usando Prelude puoi semplicemente usare C-c s( prelude-swap-windows). Dalla documentazione di Prelude:

C-c sesegue il comando crux-swap-windows(trovato in prelude-mode-map), che è un alias per crux-transpose-windowsin crux.el .


il preludio sembra un boccone (e non è confezionato da nessuna parte - curl | sh= wtf?), Ma il crux è sicuramente carino e fa un sacco di cose che ho rotolato da solo in primo luogo.
anarcat

So cosa curl | shè, quello che sto dicendo è: è il male.
anarcat

11

Non sono a conoscenza di alcuna funzione incorporata che lo faccia.

Tuttavia, non sembra troppo difficile preparare qualche elisp per farlo. Il diavolo è però nei dettagli.

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

In particolare, questo potrebbe non fare ciò che desideri rispetto a dove finisce il cursore. Tuttavia, devi prima dire quello che vuoi: p


Ho copiato e incollato questo codice e non sembra fare nulla.

Oh, scusa, fa qualcosa, scambia le parti superiore e inferiore della finestra di Emacs. Mi aspettavo che cambiasse i frame.

ok. Mi stai confondendo. hai citato Cx 3. Questo serve per creare 2 finestre di emacs, non 2 frame di emacs. Stai usando cornici o finestre? Come chiamate finestre e come chiamate frame?
Bahbar

inoltre, non hai parlato di parti superiori e inferiori. Hai più di 2 buffer visualizzati contemporaneamente?
Bahbar

Non sono la persona che ha posto la domanda, sono solo un intruso. Non avevo mai usato Cx 3 prima di aver visto questa domanda, ma come dici tu divide la finestra di Emacs, piuttosto che creare un nuovo frame.

1

Se hai preludio, puoi usare asso-finestra con S-w. Da lì puoi fare molte cose elencate nei loro documenti .

Puoi anche iniziare chiamando ace-window e poi decidere di cambiare l'azione per eliminare o scambiare ecc. Per impostazione predefinita le associazioni sono:

x - elimina la finestra

m - finestra di scambio (spostamento)

c - divide la finestra in modo equo, verticalmente o orizzontalmente

v - finestra divisa verticalmente

b - finestra divisa orizzontalmente

n - seleziona la finestra precedente

...

Così sarebbe S-w m


Per gli utenti di Spacemacs, ace-swap-windowè vincolato a SPC w M. Questa funzionalità è disponibile per impostazione predefinita.
Claudio

0

Il seguente frammento di codice può cambiare il 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

Riuscirei ad aprire il file # 2 nella posizione desiderata, cioè dopo aver premuto cx 3, sposta il cursore con cx o prima di navigare al secondo file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.