Wie kann ich zwischen zwei Fenstern wechseln, wenn mehr als zwei Fenster geöffnet sind?

8

Szenario: Ich habe mehrere (mehr als 2) Fenster geöffnet. Ich arbeite aktiv mit zwei von ihnen. Wie springe ich am besten mit einem Befehl von einem Fenster zum anderen und zurück ?

Ich benutze Ass-Fenster; Es ist großartig, aber ich möchte nicht jedes Mal die Fensternummer drücken. Ich weiß über next-window/ Bescheid prev-window, aber das sind zwei verschiedene Befehle.

Was ich suche, ist etwas, das sich daran erinnert, was die vorherigen Fenster waren, als ich ein anderes Fenster auswählte, und darauf zurückkommt. Wird es wiederholt aufgerufen, wechselt es zwischen den letzten beiden Fenstern im Alt- Tab-Stil.

Wo schaue ich

9000
quelle
Ich benutze fnplus eine der Pfeiltasten, um in eine beliebige Richtung zu gehen, einschließlich in und aus dem Minibuffer (falls er aktiv ist) - siehe die eingebaute Bibliothek windmove.
Lawlist
@lawlist: Ich weiß über Windmove Bescheid. Was ich suche, ist eine Möglichkeit, nicht über die erforderliche Richtung nachzudenken , insbesondere wenn sich zwischen den Fenstern einige andere Fenster befinden.
9000

Antworten:

6

Eine Möglichkeit, einen eigenen Befehl zu schreiben, besteht darin, die integrierte get-mru-windowFunktion zu verwenden.

Zum Beispiel:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

Dies sucht nach dem zuletzt verwendeten Fenster im aktuellen Frame, das nicht das aktuell ausgewählte Fenster ist.

Hier ist eine Variation, die über sichtbare Frames hinweg funktioniert:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

Wie in den Kommentaren erwähnt, ist hier eine Variante, die funktioniert, wenn nur ein Fenster vorhanden ist (Umschalten auf den neuesten Puffer):

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))
Glucas
quelle
1
Geschafft! Dieser ist viel besser als der, den ich zusammengestellt habe. Schöner Fund am get-mru-window.
Dan
1
Am Ende habe ich dies meiner Konfiguration mit einer zusätzlichen Variante hinzugefügt: Wenn es nur einen Frame / ein Fenster gibt (get-mru-window gibt nil zurück), dann rufe auf mode-line-other-buffer. Auf diese Weise habe ich einen Schlüssel, der in jeder Fensterkonfiguration zwischen zwei Puffern hin und her wechselt.
Glucas
Großartig. Ich liebe diese letzte Variation @glucas. Vielen Dank. Hier ist, wie ich es geschrieben habe und es funktioniert. Ist das der beste Weg, es zu tun? (defun my-switch-to-previous-window () (interaktiv) (let ((win (get-mru-window nil nil t))) (if win (select-window win) (mode-line-other-buffer ))))
Prosoitos
6

Wenn Sie bereits verwenden ace-window, können Sie mit dem Befehl aw-flip-windowzwischen zwei Fenstern hin und her blättern. Standardmäßig ist dies nim Ass-Fenster gebunden aw-dispatch-alist.

Das bedeutet, dass Sie das Ass-Fenster aufrufen und nanstelle einer Fensternummer drücken können, um zum vorherigen Fenster zurückzukehren. Sie können auch aw-flip-windowan einen anderen Schlüssel binden .

Beachten Sie, dass dies nur zu einem Fenster zurückkehrt, das zuvor von ace-window ausgewählt wurde. Wenn Sie häufig mit anderen Befehlen zwischen Fenstern wechseln, möchten Sie möglicherweise eine allgemeinere Lösung.

Glucas
quelle
4

Hier ist ein einfacher, leicht getesteter Befehl, mit dem Sie zum zuletzt besuchten Fenster wechseln:

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))
Dan
quelle
Vielen Dank! Es klappt. Stört es Sie, wenn ich daraus ein Paket mit Zuschreibung mache?
9000
Bitte. Natürlich können Sie es auch in einem Paket verwenden, aber beachten Sie, dass der Code (noch) nicht sehr intelligent ist. Wenn Sie mit Befehlen wie next-windowoder zu anderen Fenstern wechseln other-window, wird die Änderung nicht in der recent-windowVariablen übernommen. Es gibt keinen offensichtlichen Haken, der verwendet werden muss. Um diesen Teil zu reparieren, müssen möglicherweise Ratschläge für eine ganze Reihe anderer Funktionen definiert werden.
Dan
1
Ich denke, Sie könnten verwenden buffer-list-update-hook, was aufgerufen wird, wenn sich das aktive Fenster ändert (nach select-window). Dieser Hook wird in anderen Fällen aufgerufen, kann jedoch verwendet werden, um das letzte Fenster zu verfolgen.
Glucas