web-dev-qa-db-fra.com

Comment échanger les tampons dans 2 Windows Emacs

J'utilise emacs, je trouve que parfois j'ai 2 fichiers séparés en 2 fenêtres.

Par exemple: j'ouvre 1 fichier en utilisant C-x C-f file1.c RET

et j'ai divisé le cadre en deux fenêtres: C-x 3

J'ouvre ensuite un autre fichier C-x C-f file2.c RET

J'ai donc 2 fichiers:

fenêtre 1 (gauche) file1.c

fenêtre 2 (droite) file2.c

Je me demande s'il existe une combinaison de touches pour échanger les fichiers? Normalement, j'aime travailler sur la fenêtre de gauche quand j'ai 2 fenêtres. Je sais que je peux facilement faire C-x opour déplacer le curseur vers la fenêtre de droite.

Cependant, je me demande simplement si je peux échanger les fichiers afin que file2.c est dans la fenêtre de gauche et file1.c est dans la bonne fenêtre?

88
ant2009

J'utilise buffer-move pour cela. Maintenant, si vous travaillez sur le tampon sur le côté gauche, appeler "buf-move-right" le permutera avec celui de droite. Je suppose que c'est ce que tu veux.

81
Raja Selvaraj

La bibliothèque transpose-frame fournit un ensemble assez complet de fonctions pour retourner ou faire pivoter les dispositions de fenêtre dans les cadres.

M-x flop-frame RET fait ce dont cette question a besoin.

Les diagrammes suivants sont extraits du commentaire de la bibliothèque (et de sa page 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            |      |                 |       |
       +-------------------------+      +-----------------+-------+
30
phils

Dans le fichier Emacs 26.1 NEWS, il y a l'entrée suivante:

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

Ce qui semble offrir des fonctionnalités similaires à crux-transpose-windows mais peut aussi faire des transpositions hauteur/largeur?

17
dgtized

Si vous utilisez Prelude vous pouvez simplement utiliser C-c s (prelude-swap-windows). De la documentation Prelude:

C-c s exécute la commande crux-swap-windows (trouvé dans prelude-mode-map), qui est un alias pour crux-transpose-windows in crux.el .

14
zippy

Je ne suis au courant d'aucune fonction intégrée faisant cela.

Cependant, il ne semble pas trop difficile de concocter un peu d'élisp pour le faire. Le diable est dans les détails.

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

Notamment, cela peut ne pas faire ce que vous désirez en ce qui concerne la destination du caret. Cependant, vous devez d'abord dire ce que vous voulez: p

11
Bahbar

Si vous avez un prélude, vous pouvez utiliser ace-window avec S-w. De là, vous pouvez faire beaucoup de choses répertoriées dans leur docs .

Vous pouvez également commencer par appeler ace-window, puis décider de basculer l'action pour supprimer ou permuter, etc. Par défaut, les liaisons sont:

x - supprimer la fenêtre

m - fenêtre swap (move)

c - diviser la fenêtre équitablement, verticalement ou horizontalement

v - diviser la fenêtre verticalement

b - fenêtre divisée horizontalement

n - sélectionner la fenêtre précédente

...

Ce serait donc S-w m

1
phillc

L'extrait de code suivant peut faire basculer le tampon.

(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"))
0
Aborn Jiang