Jak szybko przełączać się między oknami?


90

Jak szybko przełączać się między oknami?

Często mam otwarte wiele okien i muszę się między nimi przełączać. W tej chwili korzystam C-x oz tego, którego chcę. Czy jest dostępny bardziej wydajny przepływ pracy?


Odpowiedzi:


62

Oczywiście wolę do tego okno asa . Możesz przełączać się między widocznymi oknami i ramkami. Jest w MELPA, możesz go szybko zainstalować. Jedyne, co pozostało do zrobienia, to związać to:

(global-set-key (kbd "C-x o") 'ace-window)

A może użyj krótszego akordu klawiszowego, ponieważ przełączanie okien jest częstym zadaniem:

(global-set-key (kbd "M-p") 'ace-window)

Podsumowanie ace-window

Jest to zamiennik drop-in dla other-window. W przeciwieństwie do tego drugiego, nigdy nie musisz dzwonić ace-windowdwa lub więcej razy, aby wybrać okno: wybierasz okno, które chcesz w jednym połączeniu (być może w wielu ramkach).

Oprócz przełączania okien ace-windowmożna zrobić więcej (usuwać lub zamieniać okna itp.), Zobacz CZYTAJ .


2
To jest interesujące. Użyłem, ace-windowa potem zobaczyłem, switch-windowco wydaje się robić mniej więcej to samo, z wyjątkiem tego, że litery są bardziej wyraźne. wydaje się zabawne, mamy oba pakiety.
milkypostman

Masz rację. Są tylko niewielkie różnice między nimi. Jest to problem, z którym musimy się zmierzyć, gdy mamy repozytorium z 2000 pakietami. Nie wiedziałem o tym, switch-windowdopóki nie ace-windowzgłosiłem się do MELPA.
abo-abo

1
dzięki za ace-window, ma chyba więcej możliwości dostosowywania niż inne pakiety. W przyszłości może być pomocna kluczowa funkcja powiązana z funkcją, która działałaby podobnie do akcji inteligentnej zamiany, ale zjadłaby to okno, powodując większe okno w wybranym punkcie i mniejsze wybrane okno (zjedzone okno) w górę). Stosunek należy w tym przypadku określić jako połowę, jedną czwartą lub jedną trzecią.
doktorat

4
Proszę rozważyć dodanie opisu. Po prostu mówisz, że ci się podoba i łączysz się z tym. To sprawia, że ​​jest to odpowiedź tylko do łącza.
Drew

4
Jakie są zalety okna asa? Dlaczego warto korzystać z 14 innych rozwiązań proponowanych na tej stronie?
Gilles

103

Jednym ze sposobów jest użycie windmove. Dzięki domyślnym skrótom klawiszowym umożliwia przejście do okna obok aktualnie aktywnego.

Jest wbudowany w Emacsa, więc nie trzeba niczego instalować; po prostu aktywuj go za pomocą następującej minimalnej konfiguracji w pliku init:

(windmove-default-keybindings)

Następnie można przejść do sąsiednich okien za pomocą następujących klawiszy (gdzie strzałka używany intuicyjnie określa kierunek, w którym przemieszcza się): S-<left>, S-<right>, S-<up>, S-<down>.


Jeśli wolisz użyć innego modyfikatora zamiast shift, możesz podać go jako argument windmove-default-keybindings. Na przykład:

(windmove-default-keybindings 'meta)

lub

(windmove-default-keybindings 'control)

Więcej informacji na stronie Emacs Wiki .


16
To powinna być zaakceptowana odpowiedź!
rowman

OMG, dlaczego w samouczku nie ma wzmianki o Shift + strzałkach, aby poruszać się po oknie Jest o wiele lepszy niż ctrl + o
Didier A.

Powiedziałbym, że niektóre inne odpowiedzi tutaj zawierają konfigurację redundantnego mechanizmu windmove. Być może warto zaktualizować odpowiedź, aby wspomnieć, że funkcja przyjmuje klucz modyfikujący jako argument, np. (windmove-default-keybindings 'meta)Jak sugerowano w EmacsWiki.
metaturso

Stwarza to wiele konfliktów z innymi skrótami klawiszowymi (lub z menedżerami okien). Wolę okno asa.
azzamsa

Używam czegoś podobnego (poruszam się Shift-arrow) , ale kiedy masz duży monitor z dużą ilością podziałów, taki ruch szybko staje się niewygodny. Bardziej interesujące byłoby wyliczenie okien / podziałów. Podobnie jak ace-window, ale z mniejszą liczbą naciśnięć klawiszy i oczywistym algorytmem, aby natychmiast dowiedzieć się, którą liczbę chcesz.
Hi-Angel

21

Możesz powiązać other-windowz łatwiejszą do wpisania sekwencją klawiszy.

Na przykład C-.związałem się other-windowi C-,poszedłem do poprzedniego okna.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

(defun prev-window ()
  (interactive)
  (other-window -1))

Jest to szczególnie przydatne do przenoszenia wielu okien; po przytrzymaniu klawisza Control wystarczy nacisnąć jeden przycisk, aby przejść do następnego okna. Jest to o wiele łatwiejsze niż trzy naciśnięcia klawisza na ruch.


2
+1 C-x odla other-windowjest jednym z niewielu solidnych pretendentów do tytułu „najgorszego domyślnego skrótu emacsa”. Moje rozwiązanie (podobne do Zck) polegało na ponownym powiązaniu other windowdo (o wiele łatwiejszej) sekwencji klawiszy - mam do tego przywiązany C-;(i moje Caps-Lockjest zamienione, Ctrlwięc wystarczy tylko dotknąć różyczek). Przy okazji, jestem całkowicie zależny od niektórych funkcji helmi icicles(tj. Nie jestem „anty-pakietami” ani nic takiego); Po prostu myślę, że proste rozwiązanie działa tutaj najlepiej.
iceman

2
+1 To powinna być zaakceptowana odpowiedź ORAZ najprostsza odpowiedź (niestety, nic takiego jeszcze nie istnieje na StEx). Działa od razu po wyjęciu z pudełka, doskonale się skaluje, łatwo zapamiętuje. Te ostatnie uważałem za szczególnie ważne w dżungli Emacsa. Po przeżyciu tam ponad 20 lat, czasami czuję, że tęsknie czaję się na pustyni vi ...
Andreas Spindler

Prosty, łatwy w użyciu, łatwy do wdrożenia. To wymaga więcej głosów.
stewSquared

1
To też robię. Używam M-odla other-window. Niektóre tryby już M-owiązania, zwłaszcza diff-mode, ggtag-modei ibuffer-mode. Musisz ręcznie odznaczyć go w każdej mapie trybów. unbind-keydostarczone przez bind-key.eljest bardzo przydatne.
Yasushi Shoji,

Używam M-orównież, i M-Owiąże się ace-windowdla kiedy potrzebują dodatkowego zasilania.
glucas

13

window-numeracja.el!

Przypisuję skróty „, 1”, „, 2”, „, 3”, aby przełączyć określone okno (pamiętaj, że używam trybu zła)

poza tym wyświetlam numer okna na linii trybu w RÓŻOWYM kolorze, podkreślony.

To wizualna wskazówka, której nigdy nie możesz zignorować,

To najszybszy sposób na przełączenie okna.

sprawdź https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el i https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el dla mojej konfiguracji.

Sylvain Benner przyjął mój pomysł w postaci znaków kosmicznych, ale skróty klawiszowe są inne . Więc jeśli korzystasz z kosmicznych, otrzymujesz najszybsze rozwiązanie od razu po wyjęciu z pudełka.


2
Tak. Ta koncepcja jest świetna. Używam pakietu window-numberz, M-<num>aby szybko przełączać okna czarno-białe. Podobna koncepcja do tej
unperson325680,

1
Zauważ, że window-numbering.el jest przestarzałe na rzecz winum , które jest tutaj . FWIW numerowanie okien dla mnie nawet nie działało.
Hi-Angel

Niedługo mogę przejść na Winum. Ale numeracja okien nadal działa dobrze w emacs24 / 25/26.
chen bin

10

Bez korzystania z żadnych dodatkowych dodatków możesz nadal używać C-x oopcjonalnego prefiksu, aby pomijać tak wiele okien. Np .: C-u 1 C-x oprzejdzie do następnego okna w kolejności (tzn. Co uzyskasz zwykłym C-x o), C-u 2 C-x oprzejdzie dwa okna, C-u 3 C-x oprzejdzie trzy okna i tak dalej.

Fragment dokumentacji other-window(funkcja wywoływana przez C-x o:

COUNT określa liczbę okien do pominięcia, zaczynając od wybranego okna, przed dokonaniem wyboru. Jeśli COUNT ma wartość dodatnią, pomiń COUNT okna do przodu. Jeśli COUNT jest ujemne, pomiń -COUNT okna do tyłu. COUNT zero oznacza, że ​​nie pomijaj żadnego okna, więc wybierz wybrane okno. W wywołaniu interaktywnym COUNT jest argumentem przedrostka numerycznego. Zwróć zero.


Kiedy masz wiele okien, w jakiej kolejności?
stsquad


2
hmm „Kolejność jest określana przez pierwsze przejście w głąb drzewa okna ramy, wyszukiwanie okien aktywnych, które są węzłami liści drzewa” nie jest najbardziej pomocnym opisem dla ludzkiego mózgu próbującego odgadnąć, które okno jest następne lub ile pominąć. Chyba dlatego używam okna asa.
stsquad

2
@stsquad: och, zgadzam się z tobą - powoduje to, że moja głowa też się kręci. Tutaj zamieszczam tę odpowiedź ze względu na kompletność.
Dan

8

Niektóre osoby mogą pamiętać krótkie edytor (wystarczająco zabawnie wyprodukowany przez firmę o nazwie Underware).

Miał fajny sposób przełączania się między widocznymi oknami. Strzałka M przesuwałaby kursor do okna bezpośrednio zgodnie z kierunkiem klawisza strzałki.

Więc zmapowali winmove-left, winmove-right, winmove-uporaz winmove-downfunkcje M-left, M-right, M-upa M-downklucze w następujący moim pliku .emacs -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

Teraz mogę z łatwością poruszać się między oknami, niezależnie od tego, jak zaśmiecona jest moja konfiguracja ... I może być dość zagracona wielkością wyświetlaczy w dzisiejszych czasach ...


Czy to nie mniej więcej odpowiedź @ Francesco?
Dan

Zgadzam się. Nie zauważyłem przed opublikowaniem mojego.
user2542,

2
Znacznie krótszy sposób na uzyskanie tych skrótów klawiszowych to (windmove-default-keybindings 'meta)!
Omar

8

Jeśli używasz Sople następnie C-x opozwala wybrać okna o nazwie (lub na rowerze).

  • Bez prefiksu arg C-x ojest taki sam jak zwykle, other-windowchyba że ramka ma tylko jedno okno, w którym to przypadku jest other-frame.

  • Z prefiksem arg C-x ooznacza wiele poleceń, które umożliwiają nawigację między oknami lub ramkami według nazwy (lub cyklicznie). Poruszanie się między oknami odbywa się za pomocą wielu poleceń icicle-select-window; nawigacja między zastosowaniami ramek icicle-select-frame.

To, która nawigacja jest używana, zależy od prefiksu arg:

  • Zero prefiks arg (np. C-0): Jeśli wybrana ramka ma wiele okien, oznacza to icicle-select-window, że okna są w tej samej ramce co kandydaci. W przeciwnym razie (rama pojedynczego okna), to jest icicle-select-frame.

  • C-u: Jeśli wybrana ramka ma wiele okien, oznacza to icicle-select-window, że okna ze wszystkich widocznych ramek są kandydatami. W przeciwnym razie tak jest icicle-select-frame.

  • C-u C-u: icicle-select-window, z oknami ze wszystkich ramek jako kandydatów (w tym ikonami lub ukrytymi ramkami).

Jak zawsze w Icicles , możesz łączyć (a) uzupełnianie , wpisując tekst, aby zawęzić zestaw pasujących kandydatów (w tym przypadku nazwy okien lub ram), z (b) cyklicznymi (między pasującymi kandydatami).


4

Rozważ użycie klawisza-akordu do szybkiego przeskakiwania między oknami. Uważam, że jest to znacznie szybsze niż sięganie po klawisz modyfikujący (i mniej obciążające moje ręce).

Mój wybór pakietu to taki ace-window, który pozwala łatwiej nawigować po wielu oknach other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Oczywiście do korzystania z tego potrzebujesz key-chordi ace-windowoba są dostępne w Melpa.


2
Czy to nie jest mniej więcej odpowiedź @ abo-abo?
Dan

1
@ Czy jego nie używa akordów klawiszowych? Zwróć uwagę na brak meta lub super klawiszy w akordach. Nieważne, czy używasz okna asa / czegoś innego, chodziło o udzielenie odpowiedzi, która nie używa klawiszy modyfikujących do tak często używanych operacji.
Zavior

1
Widziałem to, ale podniosłem pytanie, ponieważ ace-windowwykonuje pracę jak w odpowiedzi @ abo-abo. Uderza mnie, że w tym kontekście specyficzne użycie klawiszy byłoby bardziej sensowne niż komentarz. Tylko moje dwa centy.
Dan

@ Dan, ogólnie pytanie dotyczyło szybkiej zmiany okien i nie sądzę, aby to rozwiązanie zostało jeszcze wprowadzone. Wyjaśniłem nieco odpowiedź na ten temat.
Zavior

@Zavior podnosi ważną kwestię. Pytanie dotyczy szybkiego przełączania okien - dla których forma powiązania jest bardzo ważna. Bez względu na bibliotekę, którą preferujesz, key-chordumożliwia wiązanie bardzo dostępnych kombinacji kluczy. Przykładowe wiązanie xojest szybsze niż C-x o(głębokość jeden kontra dwa). Tę odpowiedź można przeformułować, aby podkreślić, że odpowiedź jest ortogonalna w stosunku do innych odpowiedzi dotyczących wyboru funkcji (i ace-windowjest tylko jedną z wielu opcji, które można powiązać w opisany sposób). Zachowaj tę odpowiedź jako wyraźną!
ebpa

3

Kilka dobrych odpowiedzi tutaj, jestem również fanem WinMove, ale wiążę go z C-, ponieważ tryb org używa M- do manipulowania nagłówkami

(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)

Naprawdę dobrze jest, jeśli połączysz go z Hydrą . Podążając za przykładami na ich wiki , stworzyłem własnego potwora:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

Pozwala mi to zmieniać okna, zmieniać ich rozmiar, przenosić bufory z okna do okna, buforować cyklicznie, zabijać bufory, a nawet cofać konfiguracje okien poprzez tryb Zwycięzca, a także integruje ster. Aby wyjść z hydry, wystarczy nacisnąć strzałkę lub inny klawisz, którego nie ma w hydrze. Możesz znaleźć funkcje „hydra-move” na przykładach hydry . Wspaniałą rzeczą w hydrze jest to, że nie muszę pamiętać wszystkich tych skrótów klawiszowych i ich „modnego”, więc kiedy jesteś w hydrze, wszystko jest dostępne jako pojedynczy klawisz naciśnij.


1
Krótszy sposób na uzyskanie skrótów klawiszowych wspomnianych na początku to (windmove-default-keybindings 'control).
Omar

1

Jeśli używasz evil-mode, możesz po prostu użyć prefiksu numerycznego za pomocą C-w C-w( evil-window-next), aby wybrać żądane okno. Więc: 1 C-w C-wwybiera pierwsze okno w cyklicznej kolejności, 3 C-w C-wwybiera trzecie okno w cyklicznej kolejności i tak dalej.


Wydaje się, że należy to po prostu połączyć z drugą odpowiedzią : to to samo, tylko z powiązaniami specyficznymi dla zła.
npostavs

1

Ace Jump pozwala nawigować wskaźnikiem do wszystkich słów na ekranie, niezależnie od okna lub ramki, więc nie różni się tak bardzo od korzystania z Ace Window lub Switch Window.

Zaletą może być to, że podczas przeskakiwania okien można również precyzyjnie umieścić wskaźnik.

Nadal uważam, że jest to trochę kłopotliwe lub rozpraszające, i używam windmovewięcej, ponieważ jest to bardzo proste, ale nadal używam Ace Jump, gdy czytam w innym oknie lub ramce i chcę się tam przenieść.


1

Jak zwykle istnieje sto różnych sposobów osiągnięcia tego celu. Mój preferowany sposób to korzystanie z NumberedWindows . Następnie ustawiam następujący skrót klawiszowy za pomocą Super i klawiszy 1-9.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Zagłębiam się bardziej szczegółowo na ten temat w moim ostatnim poście, który możesz przeczytać w Afternoon Coder .


Czym różni się to od odpowiedzi Chen bin ?
Gilles

Ma przykład jego konfiguracji.
Travis

-1

Możesz także zdecydować się na użycie przełącznika jako wizualnego zamiennikaC-x o


1
Jakie są zalety przełączania okien? Dlaczego warto korzystać z 14 innych rozwiązań proponowanych na tej stronie?
Gilles

Jak mówi powinieneś? W Emacs chodzi o alternatywy, dostosowanie i swobodę decydowania.
csantosb

2
To nie jest ani tu, ani tam. Dlaczego ktoś miałby wybrać tę konkretną alternatywę? Dlaczego ktoś decyduje się na użycie w switch-windowstosunku do wszystkich innych?
Gilles
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.