Wie wechselt man schnell zwischen den Fenstern?


90

Wie wechsle ich schnell zwischen Fenstern?

Ich habe oft mehrere Fenster geöffnet und muss zwischen ihnen wechseln. Im Moment C-x okomme ich zu dem, den ich will. Gibt es dafür einen effizienteren Workflow?


Antworten:


62

Ich bevorzuge offensichtlich ein Ass-Fenster dafür. Sie können zwischen sichtbaren Fenstern und Rahmen wechseln. Es ist in MELPA, Sie können es schnell installieren. Sie müssen es nur noch binden:

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

Oder verwenden Sie einen kürzeren Tastenakkord, da das Wechseln des Fensters häufig vorkommt:

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

Zusammenfassung von ace-window

Es ist ein Ersatz für other-window. Im Gegensatz zu letzterem müssen Sie ace-windowzum Auswählen eines Fensters nie zweimal oder öfter aufrufen : Sie wählen ein Fenster aus, das Sie in einem Aufruf (möglicherweise über mehrere Frames hinweg) aufrufen möchten.

Sie ace-windowkönnen nicht nur Fenster wechseln, sondern auch mehr (Fenster löschen oder tauschen usw.) . Weitere Informationen finden Sie in der README-Datei .


2
Das ist interessant. Ich habe benutzt ace-windowund dann gesehen, switch-windowwas ungefähr dasselbe zu tun scheint, außer dass die Buchstaben ausgeprägter sind. Scheint lustig, wir haben beide Pakete.
Milchpfosten

Du hast recht. Es gibt nur kleine Unterschiede zwischen ihnen. Dies ist ein Problem, dem wir uns stellen müssen, wenn wir ein Repository mit 2000 Paketen haben. Ich wusste es nicht, switch-windowbis ich mich bei ace-windowMELPA anmeldete.
abo-abo

1
Danke ace-window, es hat mehr Anpassungsmöglichkeiten als andere Pakete, denke ich. Eine mögliche Hilfe für die Zukunft ist die Schlüsselbindung für eine Funktion, die der Smart - Swap - Aktion ähnelt, jedoch dieses Fenster verschlingt, was dazu führt, dass ein größeres Fenster an einem Punkt und ein kleineres ausgewähltes Fenster (das gegessene Fenster) vorhanden sind Fenster auf). Das Verhältnis sollte in diesem Fall als eine Hälfte, ein Viertel oder ein Drittel bestimmt werden.
Promotion

4
Bitte fügen Sie eine Beschreibung hinzu. Sie sagen nur, dass Sie es mögen, und Sie verlinken darauf. Das macht dies im Wesentlichen eine Nur-Link-Antwort.
Drew

4
Was ist der Vorteil von ace-window? Warum sollte ich es über die 14 anderen auf dieser Seite vorgeschlagenen Lösungen verwenden?
Gilles

103

Ein Weg ist zu benutzen windmove. Mit den Standard-Tastenkombinationen können Sie in das Fenster neben dem derzeit aktiven Fenster wechseln.

Es ist in Emacs integriert, sodass Sie nichts installieren müssen. aktiviere es einfach mit dem folgenden minimalen Setup in deiner Init-Datei:

(windmove-default-keybindings)

Sie können dann zu den benachbarten Fenstern wechseln die folgenden Tasten (wo der Pfeil intuitiv definiert die Richtung verwendet , in dem Sie sich bewegen): S-<left>, S-<right>, S-<up>, S-<down>.


Wenn Sie stattdessen lieber einen anderen Modifikator verwenden möchten shift, können Sie ihn als Argument für angeben windmove-default-keybindings. Zum Beispiel:

(windmove-default-keybindings 'meta)

oder

(windmove-default-keybindings 'control)

Weitere Informationen im Emacs Wiki .


16
Dies sollte die akzeptierte Antwort sein!
Rowman

OMG, warum erwähnt kein Tutorial Shift + Pfeiltasten, um sich im Fenster zu bewegen! Es ist so viel besser als Strg + O
Didier A.

Ich würde sagen, dass einige der anderen Antworten hier redundante Windmove-Konfigurationen enthalten. Vielleicht lohnt es sich, die Antwort zu aktualisieren, um zu erwähnen, dass die Funktion die Modifizierertaste als Argument akzeptiert, z. B. (windmove-default-keybindings 'meta)wie in EmacsWiki vorgeschlagen.
Metaturso

Dies führt zu Konflikten mit anderen Tastenkombinationen (oder mit Fenstermanagern). Ich bevorzuge ein Ass-Fenster.
Azzamsa

Ich benutze etwas Ähnliches (ich bewege mich mit Shift-arrow) , aber wenn Sie einen großen Monitor mit vielen Spalten haben, wird eine solche Bewegung schnell unhandlich. Es wäre interessanter, Fenster / Teilungen irgendwie aufzuzählen. Wie ace-window, aber mit weniger Tastendrücken und einem offensichtlichen Algorithmus, um die gewünschte Zahl sofort herauszufinden.
Hi-Angel

21

Sie können other-windoweine einfachere Tastenfolge festlegen.

Zum Beispiel habe ich C-.gebunden other-windowund C-,gebunden, um zum vorherigen Fenster zu gehen.

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

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

Dies ist besonders nützlich, um mehrere Fenster zu verschieben. Sobald Sie die Strg-Taste gedrückt halten, müssen Sie nur eine einzige Taste drücken, um zum nächsten Fenster zu gelangen. Dies ist viel einfacher als drei Tastendrücke pro Zug.


2
+1 C-x ofür other-windowist einer der wenigen soliden Anwärter auf den Titel "Worst Default Emacs Shortcut". Meine Lösung (ähnlich wie zck) bestand darin other window, eine (wesentlich) einfachere Tastenfolge wiederherzustellen - an die ich mich gebunden habe C-;(und meine Caps-Lockist so getauscht, Ctrldass es nur ein kurzes Antippen der kleinen Finger dauert). Übrigens bin ich total abhängig von bestimmten Funktionen von helmund icicles(dh ich bin nicht "Anti-Pakete" oder so); Ich denke nur, dass eine einfache Lösung hier am besten funktioniert.
Iceman

2
+1 Dies sollte die akzeptierte Antwort sein UND auch die einfachste Antwort (leider gibt es noch keine solche auf StEx). Funktioniert sofort, skaliert perfekt und ist einfach zu merken. Letzteres fand ich besonders wichtig im Emacs-Dschungel. Nachdem ich dort über 20 Jahre überlebt habe, lauere ich manchmal sehnsüchtig in der vi-Wüste ...
Andreas Spindler

Einfach, leicht zu bedienen, leicht zu implementieren. Das braucht mehr Stimmen.
StewSquared

1
Das ist auch was ich tue. Ich benutze M-ofür other-window. Einige Modi haben bereits M-overbindlich, insbesondere diff-mode, ggtag-modeund ibuffer-mode. Sie müssen es in jeder Moduszuordnung manuell entbinden. unbind-keyzur Verfügung gestellt von bind-key.elist sehr nützlich.
Yasushi Shoji

Ich benutze M-oauch, und habe M-Ogebunden, ace-windowwenn ich die zusätzliche Kraft brauche.
Glucas

13

Fensternummerierung.el!

Ich weise den Hotkey ", 1", ", 2", ", 3" zu, um ein bestimmtes Fenster zu wechseln (bitte beachten Sie, dass ich den Böse-Modus verwende)

Außerdem zeige ich die Fensternummer in der Moduszeile in PINK-Farbe unterstrichen an.

Es ist ein visueller Hinweis, den Sie niemals ignorieren können.

Das ist der schnellste Weg , um das Fenster zu wechseln.

Überprüfen Sie https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el und https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el für mein Setup.

Sylvain Benner hat meine Idee in Spacemacs übernommen, aber die Tastenkombinationen sind unterschiedlich . Wenn Sie also Spacemacs verwenden, erhalten Sie die schnellste Lösung.


2
Jep. Dieses Konzept ist großartig. Ich benutze Paket window-numbermit, M-<num>um schnell s / w Fenster zu wechseln. Ein ähnliches Konzept wie dieses
unperson325680

1
Beachten Sie, dass window-numbering.el zu Gunsten von winum , das sich hier befindet, veraltet ist . FWIW die Fensternummerierung für mich hat nicht einmal funktioniert.
Hallo-Engel

Ich könnte bald zu winum wechseln. Aber die Fensternummerierung funktioniert auf emacs24 / 25/26 immer noch einwandfrei.
Chen Bin

10

Ohne zusätzliche Add-Ons können Sie weiterhin C-x oein optionales Präfix verwenden, um so viele Fenster zu überspringen. ZB: C-u 1 C-x oGeht zum nächsten Fenster in der Reihenfolge (dh was Sie mit plain erhalten würden C-x o), C-u 2 C-x ogeht zwei Fenster weiter, C-u 3 C-x ogeht drei Fenster weiter und so weiter.

Ein Auszug aus dem other-windowDocstring (die Funktion, die aufgerufen wird von C-x o:

COUNT gibt die Anzahl der Fenster an, die übersprungen werden sollen, beginnend mit dem ausgewählten Fenster, bevor die Auswahl getroffen wird. Wenn COUNT positiv ist, überspringen Sie COUNT Fenster vorwärts. Wenn COUNT negativ ist, überspringen Sie -COUNT Fenster rückwärts. COUNT Zero bedeutet, dass kein Fenster übersprungen wird. Wählen Sie daher das ausgewählte Fenster aus. In einem interaktiven Aufruf ist COUNT das numerische Präfixargument. Zurück nil.


In welcher Reihenfolge werden mehrere Fenster angezeigt?
Stsquad

Die Reihenfolge ist die zyklische Fensterreihenfolge .
Dan

2
hmm "Die Reihenfolge wird durch eine erste Durchquerung des Fensterbaums des Frames bestimmt, wobei die aktiven Fenster, die die Blattknoten des Baums sind, abgerufen werden" ist nicht die hilfreichste Beschreibung für das menschliche Gehirn, das zu erraten versucht, welches Fenster das nächste oder nächste ist wie viele zu überspringen. Ich denke, das ist der Grund, warum ich ein Ass-Fenster benutze.
Stsquad

2
@stsquad: oh, ich stimme dir zu - es bringt auch meinen Kopf zum drehen. Der Vollständigkeit halber habe ich diese Antwort hier aufgeführt.
Dan

8

Einige Leute erinnern sich vielleicht an den Editor Brief (lustig genug von einer Firma namens Underware produziert).

Es hatte eine gute Möglichkeit, zwischen sichtbaren Fenstern zu wechseln. M-Pfeil würde den Cursor direkt in der Richtung der Pfeiltaste in das Fenster bewegen.

Also, ich abgebildet , die winmove-left, winmove-right, winmove-upund winmove-downFunktionen M-left, M-right, M-upund M-downTasten wie in meiner .emacs - Datei folgt -

(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

Jetzt kann ich mühelos zwischen den Fenstern wechseln, unabhängig davon, wie überladen die Konfiguration ist ... Und es kann heutzutage mit der Größe der Displays ziemlich überladen werden ...


Ist das nicht mehr oder weniger @ Francescos Antwort?
Dan

Genau. Ich habe es nicht bemerkt, bevor ich meins gepostet habe.
user2542

2
Ein viel kürzerer Weg, um diese Tastenkombinationen zu erhalten, ist (windmove-default-keybindings 'meta)!
Omar

8

Wenn Sie Icicles dann C-x okönnen Sie auswählen , Fenster durch Namen (oder Radfahren).

  • Ohne Präfix arg C-x oist wie gewohnt, es other-windowsei denn, der Frame hat nur ein Fenster. In diesem Fall ist es other-frame.

  • Mit einem Präfix arg, C-x oist ein Multibefehl , mit dem Sie nach Namen (oder durch Radfahren) zwischen Fenstern oder Frames navigieren können. Zum Navigieren zwischen Fenstern werden mehrere Befehle verwendet icicle-select-window. Navigation zwischen Frames verwendet icicle-select-frame.

Welche Navigation verwendet wird, hängt vom Präfix arg ab:

  • Null prefix arg (z C-0): Wenn der ausgewählte Rahmen mehrere Fenster hat, dann ist dies icicle-select-windowmit Fenstern in dem gleichen Rahmen als Kandidaten. Ansonsten (Einzelfensterrahmen) ist dies icicle-select-frame.

  • C-u: Wenn der ausgewählte Frame mehrere Fenster hat, sind dies icicle-select-windowFenster aus allen sichtbaren Frames als Kandidaten. Ansonsten ist das so icicle-select-frame.

  • C-u C-u: icicle-select-window, mit Fenstern aus allen Frames als Kandidaten (einschließlich symbolisierter oder ausgeblendeter Frames).

Wie immer in Icicles können Sie (a) Vervollständigung kombinieren , indem Sie Text eingeben, um den Satz übereinstimmender Kandidaten (in diesem Fall Fenster- oder Frame-Namen) einzugrenzen , und (b) zwischen übereinstimmenden Kandidaten wechseln.


4

Verwenden Sie einen Tastenakkord, um schnell zwischen den Fenstern zu wechseln. Ich finde es viel schneller als nach einer Modifikatortaste zu greifen (und auch meine Hände weniger zu belasten).

Ich wähle ein Paket aus ace-window, mit dem Sie einfacher als nur durch mehrere Fenster navigieren können other-window.

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

Um dies nutzen zu können, benötigen Sie natürlich key-chordund ace-window, beide sind in melpa verfügbar.


2
Ist das nicht mehr oder weniger die Antwort von @abo-abo?
Dan

1
@Dann benutzt er keinen Tastenakkord, beachte das Fehlen von Meta- oder Superschlüsseln im Akkord. Ob Sie ein Ass-Fenster verwenden oder etwas anderes, ist ein bisschen irrelevant. Der Punkt war, eine Antwort zu geben, die keine Modifikatortasten für so häufig verwendete Operationen verwendet.
Verhalten

1
Ich habe das gesehen, aber ich habe die Frage aufgeworfen, weil ace-windowdie Arbeit so ist, wie in der Antwort von @abo-abo. Es fällt mir auf, dass in diesem Zusammenhang die spezielle Tastenkombination eher als Kommentar als als Antwort sinnvoll wäre. Nur meine zwei Cent.
Dan

@Dan, insgesamt ging es um ein schnelles Wechseln der Fenster, und ich glaube, diese Lösung wurde noch nicht angesprochen. Klarstellung der Antwort ein wenig in Bezug auf das.
Zavior

@ Verhalten wirft einen wichtigen Punkt auf. Die Frage ist, wie schnell die Fenster gewechselt werden können, für die die Form der Bindung sehr wichtig ist. Unabhängig von der von Ihnen bevorzugten Bibliothek können Sie key-chordsehr leicht zugängliche Tastenkombinationen binden. Die Beispielbindung von xoist schneller als C-x o(Tiefe von eins gegen zwei). Diese Antwort könnte umformuliert werden, um zu betonen, dass die Antwort orthogonal zu den anderen Antworten zur Funktionsauswahl ist (und ace-windownur eine von vielen Möglichkeiten ist, die auf die beschriebene Weise eingeschränkt werden könnten). Behalte diese Antwort als eindeutig!
Ebpa

3

Einige gute Antworten hier, ich bin auch ein Fan von WinMove, aber ich binde es an C-, weil der Organisationsmodus M- zum Bearbeiten von Überschriften verwendet

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

Wirklich gut wird es, wenn Sie es mit Hydra kombinieren . Nach den Beispielen in ihrem Wiki habe ich mein eigenes Monster erstellt:

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

Auf diese Weise kann ich die Fenster ändern, ihre Größe ändern, Puffer von Fenster zu Fenster verschieben, Puffer wechseln, Puffer löschen und sogar Fensterkonfigurationen über den Winner-Modus rückgängig machen. Zum Verlassen der Hydra drücken Sie einfach den Pfeil oder eine andere Taste, die sich nicht in der Hydra befindet. Die "Hydra-Move" -Funktionen finden Sie in den Hydra-Beispielen. Das Tolle an Hydra ist, dass ich mich nicht an all diese Tastenkombinationen und ihre "Modifikation" erinnern muss. Sobald Sie in der Hydra sind, ist alles als ein einziger Schlüssel verfügbar Drücken Sie.


1
Ein kürzerer Weg, um die eingangs erwähnten Tastenkombinationen zu erhalten, ist (windmove-default-keybindings 'control).
Omar,

1

Wenn Sie verwenden evil-mode, können Sie einfach ein numerisches Präfix mit C-w C-w( evil-window-next) verwenden, um das gewünschte Fenster auszuwählen. Also: 1 C-w C-wwählt das erste Fenster in zyklischer Reihenfolge aus, 3 C-w C-wwählt das dritte Fenster in zyklischer Reihenfolge aus und so weiter.


Dies scheint so, als sollte es nur mit Ihrer anderen Antwort kombiniert werden : Es ist dasselbe, nur mit bösartigen spezifischen Bindungen.
Npostavs

1

Mit Ace Jump können Sie mit Ihrem Mauszeiger zu allen Wörtern auf einem Bildschirm navigieren, unabhängig davon, in welchem ​​Fenster oder Rahmen sie sich befinden. Dies unterscheidet sich also nicht von der Verwendung von Ace Window oder Switch Window.

Ein Vorteil könnte sein, dass Sie beim Springen von Fenstern auch Ihren Mauszeiger mit einiger Präzision platzieren können.

Ich finde es immer noch etwas umständlich oder ablenkend und benutze windmovemehr, weil es sehr einfach ist, aber benutze immer noch Ace Jump, wenn ich in einem anderen Fenster oder Frame gelesen habe und mich an eine Stelle dort bewegen möchte.


1

Wie üblich gibt es hundert verschiedene Möglichkeiten, dies zu erreichen. Mein bevorzugter Weg ist die Verwendung von NumberedWindows . Ich stelle dann die folgende Tastenkombination mit Super und den Tasten 1-9 ein.

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

Ich gehe auf dieses genaue Thema mit einem kürzlich erschienenen Beitrag von mir ein, den Sie auf Afternoon Coder lesen können .


Wie unterscheidet sich das von Chen Bins Antwort ?
Gilles

Hat ein Beispiel für die Konfiguration.
Travis

-1

Sie können sich auch dafür entscheiden, switch-window als visuellen Ersatz für zu verwendenC-x o


1
Was ist der Vorteil von switch-window? Warum sollte ich es über die 14 anderen auf dieser Seite vorgeschlagenen Lösungen verwenden?
Gilles

Wie sagt man sollte? Bei Emacs dreht sich alles um Alternativen, Anpassung und Entscheidungsfreiheit.
csantosb

2
Das ist weder hier noch da. Warum sollte sich jemand für diese spezielle Alternative entscheiden? Warum sollte man sich entscheiden, switch-windowüber alle anderen zu verwenden?
Gilles
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.