So tauschen Sie die Puffer in 2 Windows-Emacs aus


98

Ich benutze Emacs Ich finde, dass ich manchmal 2 Dateien in 2 Fenster getrennt habe.

Zum Beispiel: Ich öffne 1 Datei mit C-x C-f file1.c RET

und ich teilte den Rahmen in zwei Fenster: C-x 3

Ich öffne dann eine andere Datei C-x C-f file2.c RET

Ich habe also 2 Dateien:

Fenster 1 (links) file1.c

Fenster 2 (rechts) file2.c

Ich frage mich, ob es eine Tastenkombination gibt, um die Dateien auszutauschen. Normalerweise arbeite ich gerne am linken Fenster, wenn ich 2 Fenster habe. Ich weiß, dass ich C-x oden Cursor leicht in das rechte Fenster bewegen kann .

Ich frage mich jedoch nur, ob ich die Dateien so austauschen kann, dass sie file2.csich im linken und file1.cim rechten Fenster befinden.


Dies funktioniert auch (getestet in emacs24): Transponieren von zwei Puffern Es scheint ähnlich zu sein wie die Antwort von Bahbar
Neffe vom

Antworten:


88

Ich benutze dafür Buffer-Move . Wenn Sie nun an dem Puffer auf der linken Seite arbeiten, wird er durch Aufrufen von 'buf-move-right' gegen den Puffer auf der rechten Seite ausgetauscht. Ich denke, das ist was du willst.


Diese Lösung ist perfekt und die Kommentare sind sehr klar - lesen Sie sie unbedingt :)
Martin Clarke

3
Wenn Sie nur Fenster tauschen möchten (unabhängig von dem ausgewählten), können Sie Folgendes verwenden(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 hat bei mir mit dem Layout von nur zwei Fenstern nicht funktioniert, aber win-swapes hat gut funktioniert, danke!
Dolzenko

1
In dieser Buffer-Move-Quelle sehen Sie einen Kommentar zu den wichtigsten Zuordnungen für C-S-upto buf-move-upusw.
Micah Elliott

34

Die Transponierungsrahmenbibliothek bietet einen ziemlich umfassenden Satz von Funktionen zum Spiegeln oder Drehen der Fensteranordnungen in Rahmen.

M-x flop-frame RET tut, was diese spezielle Frage braucht.

Die folgenden Diagramme stammen aus dem Kommentar in der Bibliothek (und ihrer EmacsWiki-Seite):

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-framefunktioniert nur, wenn die Aufteilung zwischen den Fenstern vertikal ist. Für die horizontale Aufteilung benötigen Sie flip-frame. Funktioniert jedoch rotate-frameunabhängig davon; ein Befehl, um die Puffer zwischen zwei Fenstern zu tauschen, unabhängig von der geteilten Ausrichtung :)
legends2k

33

In der Emacs 26.1 NEWS-Datei befindet sich der folgende Eintrag:

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

Was scheint ähnliche Funktionen zu bieten crux-transpose-windows, kann aber auch einige Höhen / Breiten-Transpositionen durchführen?


Ja, das funktioniert. Ich habe Emacs> 26.1. M-x window-swap-statestauschte die Puffer zwischen den beiden Fenstern.
Samrat Debroy

15

Wenn Sie Prelude verwenden , können Sie einfach C-c s( prelude-swap-windows) verwenden. Aus der Prelude-Dokumentation:

C-c sführt den Befehl crux-swap-windows(gefunden in prelude-mode-map) aus, der ein Alias ​​für crux-transpose-windowsin crux.el ist .


Der Auftakt sieht aus wie ein Schluck (und er ist nirgendwo verpackt - curl | sh= wtf?), aber Crux sieht auf jeden Fall gut aus und macht eine Menge Sachen, die ich selbst gemacht habe.
Anarcat

Ich weiß was curl | shist, was ich sage ist: es ist böse.
Anarcat

11

Mir ist keine eingebaute Funktion bekannt, die dies tut.

Es scheint jedoch nicht allzu schwierig zu sein, ein Elisp dafür zu zaubern. Der Teufel steckt jedoch im Detail.

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

Insbesondere kann dies nicht das tun, was Sie sich wünschen, wenn es darum geht, wo das Caret landet. Sie müssen jedoch zuerst sagen, was Sie möchten: p


Ich habe diesen Code kopiert und eingefügt, und er scheint nichts zu bewirken.

Oh, tut mir leid, es macht etwas, es tauscht den oberen und unteren Teil des Emacs-Fensters aus. Ich hatte erwartet, dass es die Rahmen tauschen würde.

OK. Du verwirrst mich. Sie haben Cx 3 erwähnt. Hiermit werden 2 Emacs-Fenster erstellt, nicht 2 Emacs-Frames. Verwenden Sie Rahmen oder Fenster? Wie nennt man Windows und wie nennt man Frames?
Bahbar

Außerdem haben Sie nicht über Ober- und Unterteile gesprochen. Haben Sie mehr als 2 Puffer gleichzeitig angezeigt?
Bahbar

Ich bin nicht die Person, die die Frage gestellt hat, ich bin nur ein Eindringling. Ich hatte Cx 3 noch nie verwendet, bevor ich diese Frage sah, aber wie Sie sagen, teilt es das Emacs-Fenster, anstatt einen neuen Rahmen zu erstellen.

1

Wenn Sie das Vorspiel haben, können Sie das Ass-Fenster mit verwenden S-w. Von dort aus können Sie viele Dinge tun, die in ihren Dokumenten aufgeführt sind .

Sie können auch beginnen, indem Sie ace-window aufrufen und dann entscheiden, die Aktion auf Löschen oder Tauschen usw. umzustellen. Standardmäßig lauten die Bindungen:

x - Fenster löschen

m - Fenster tauschen (verschieben)

c - Fenster fair teilen, entweder vertikal oder horizontal

v - Fenster vertikal teilen

b - Fenster horizontal teilen

n - Wählen Sie das vorherige Fenster aus

...

So wäre es S-w m


Für Spacemacs-Benutzer ace-swap-windowist gebunden SPC w M. Diese Funktionalität ist standardmäßig verfügbar.
Claudio

0

Das folgende Code-Snippet kann den Puffer wechseln.

(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

Ich würde es erfinden, Datei 2 an der gewünschten Stelle zu öffnen, dh nachdem Sie cx 3 gedrückt haben, bewegen Sie den Cursor mit cx o, bevor Sie zur zweiten Datei navigieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.