Jak zamienić bufory w 2 emacsach Windows


98

Używam emacsa. Czasami mam 2 pliki rozdzielone na 2 okna.

Na przykład: otwieram 1 plik za pomocą C-x C-f file1.c RET

i podzieliłem ramkę na dwa okna: C-x 3

Następnie otwieram inny plik C-x C-f file2.c RET

Więc mam 2 pliki:

okienko 1 (lewe) file1.c

okienko 2 (prawe) file2.c

Zastanawiam się, czy jest jakaś kombinacja klawiszy do zamiany plików? Zwykle lubię pracować na lewym oknie, gdy mam 2 okna. Wiem, że mogę z łatwością C-x oprzesunąć kursor do prawego okna.

Zastanawiam się jednak tylko, czy mogę zamienić pliki tak, aby file2.cznajdował się w lewym oknie i file1.cw prawym?


Działa to również (testowane w emacs24): transponujących Dwa Zderzaki Wydaje się podobny do Bahbar odpowiedzi
nephewtom

Odpowiedzi:


88

Używam do tego ruchu bufora . Teraz, jeśli pracujesz nad buforem po lewej stronie, wywołanie „buf-move-right” zamieni go na bufor po prawej stronie. Myślę, że tego chcesz.


To rozwiązanie jest idealne, a komentarze są bardzo jasne - po prostu koniecznie je przeczytaj :)
Martin Clarke

3
Jeśli chcesz po prostu zamienić okna (niezależnie od wybranego), możesz użyć następującego(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 nie działał dla mnie z układem tylko dwóch okien, ale z win-swapnim działał dobrze, dzięki!
dolzenko

1
Wewnątrz tego źródła bufor-move zobaczysz komentarz o wszystkie ważne dla mapowania C-S-updo buf-move-upitp
Micah Elliott

34

Transpozycji rama biblioteka zapewnia całkiem kompleksowy zestaw funkcji do przewracania lub obracanie ustaleń okno w ramkach.

M-x flop-frame RET robi to, czego potrzebuje to konkretne pytanie.

Poniższe diagramy pochodzą z komentarza w bibliotece (i jej strony 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-framedziała tylko wtedy, gdy podział między oknami jest pionowy, do podziału poziomego potrzebujesz flip-frame. Jednak rotate-framedziała niezależnie; jedno polecenie, aby zamienić bufory między dwoma oknami, bez względu na podzieloną orientację :)
legends2k

33

W pliku NEWS Emacsa 26.1 znajduje się następujący wpis:

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

Który wydaje się oferować podobną funkcjonalność, crux-transpose-windowsale może również wykonywać transpozycje wysokości / szerokości?


Tak, to działa. Mam Emacsa> 26.1. M-x window-swap-stateszamienił bufory między dwoma oknami.
Samrat Debroy

15

Jeśli używasz Prelude , możesz po prostu użyć C-c s( prelude-swap-windows). Z dokumentacji Prelude:

C-c swykonuje polecenie crux-swap-windows(znajdujący się w prelude-mode-map), która jest alias crux-transpose-windowsw crux.el .


preludium wygląda jak kęs (i nie jest nigdzie zapakowane - curl | sh= wtf?), ale crux na pewno wygląda ładnie i przede wszystkim robi kilka rzeczy, które sam zwinąłem.
anarcat

Wiem, co curl | shjest, to, co mówię, to: to jest złe.
anarcat

11

Nie znam żadnej wbudowanej funkcji, która to robi.

Jednak nie wydaje się zbyt trudne zebranie elipa, aby to zrobić. Jednak diabeł tkwi w szczegółach.

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

Warto zauważyć, że może to nie oznaczać robienia tego, czego pragniesz, w odniesieniu do miejsca, w którym kończy się opiekun. Najpierw jednak musiałbyś powiedzieć, co chcesz: str


Skopiowałem i wkleiłem ten kod i wygląda na to, że nic nie robi.

Och, przepraszam, robi coś, zamienia górną i dolną część okna Emacsa. Spodziewałem się, że zamieni ramki.

dobrze. Wprawiasz mnie w zakłopotanie. wspomniałeś o Cx 3. Ma to na celu stworzenie 2 okien emacsa, a nie 2 ramek emacsa. Używasz ramek czy okien? Co nazywasz oknami, a jak ramkami?
Bahbar

nie wspominałeś też o części górnej i dolnej. Czy jednocześnie wyświetlają się więcej niż 2 bufory?
Bahbar

Nie jestem osobą, która zadała pytanie, jestem tylko intruzem. Nigdy nie używałem Cx 3, zanim zobaczyłem to pytanie, ale jak mówisz, dzieli ono okno Emacsa, zamiast tworzyć nową ramkę.

1

Jeśli masz preludium, możesz użyć ace-window z S-w. Stamtąd możesz robić wiele rzeczy wymienionych w ich dokumentach .

Możesz także zacząć od wywołania ace-window, a następnie zdecydować o przełączeniu akcji na usunięcie lub zamianę itp. Domyślnie powiązania to:

x - usuń okno

m - okno wymiany (przesuwania)

c - podziel okno sprawiedliwie, pionowo lub poziomo

v - podziel okno w pionie

b - podziel okno w poziomie

n - wybierz poprzednie okno

...

Tak by było S-w m


Dla użytkowników Spacemacs, ace-swap-windowjest to obowiązkowe SPC w M. Ta funkcja jest dostępna domyślnie.
Claudio,

0

Poniższy fragment kodu może przełączać bufor.

(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

Udało mi się otworzyć plik nr 2 w żądanej lokalizacji, tj. Po naciśnięciu cx 3 przesuń kursor za pomocą cx o przed przejściem do drugiego pliku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.