Comment alterner entre deux fenêtres lorsque j'en ai plus de deux ouvertes?

8

Scénario: j'ai plusieurs (plus de 2) fenêtres ouvertes. Je travaille activement avec deux d'entre eux. Comment passer au mieux d'une fenêtre à l'autre, et inversement, avec une seule commande?

J'utilise ace-window; c'est super mais je ne veux pas appuyer sur le numéro de la fenêtre à chaque fois. Je connais next-window/ prev-window, mais ce sont deux commandes différentes.

Ce que je recherche, c'est quelque chose qui se souvient de ce qu'étaient les fenêtres précédentes lorsque je sélectionne une autre fenêtre et y revient. Appelé à plusieurs reprises, il basculerait entre les deux dernières fenêtres, Alt- Tab-style.

Où est-ce que je regarde?

9000
la source
J'utilise fnplus une des touches fléchées pour aller dans n'importe quelle direction, y compris dans et hors du mini-tampon (s'il est actif) - voir la bibliothèque intégrée windmove.
lawlist
@lawlist: Je connais Windmove. Ce que je recherche, c'est une façon de ne pas penser à la direction requise, surtout si les fenêtres ont quelques autres fenêtres entre elles.
9000

Réponses:

6

Une façon d'écrire votre propre commande est d'utiliser la get-mru-windowfonction intégrée.

Par exemple:

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

Cela recherche la fenêtre la plus récemment utilisée dans le cadre actuel qui n'est pas la fenêtre actuellement sélectionnée.

Voici une variante qui fonctionne sur des cadres visibles:

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

Comme mentionné dans les commentaires, voici une variante qui fonctionne quand il n'y a qu'une seule fenêtre (passage au tampon le plus récent):

(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
la source
1
J'y suis arrivé! Celui-ci est bien meilleur que celui que j'ai mis en place. Belle trouvaille get-mru-window.
Dan
1
J'ai fini par ajouter cela à ma config avec une variation supplémentaire: quand il n'y a qu'un seul cadre / fenêtre (get-mru-window renvoie nil), alors appelez mode-line-other-buffer. De cette façon, j'ai une clé qui bascule entre deux tampons dans n'importe quelle configuration de fenêtre.
glucas
Génial. J'adore cette dernière variation @glucas. Je vous remercie. Voici comment je l'ai écrit et ça fonctionne. Est-ce la meilleure façon de procéder? (defun my-switch-to-previous-window () (interactif) (let ((win (get-mru-window nil nil t)))) if if win (select-window win) (mode-line-other-buffer ))))
prosoitos
6

Si vous utilisez déjà ace-window, vous pouvez utiliser la commande aw-flip-windowpour basculer entre deux fenêtres. Par défaut, cela est lié à nla fenêtre as aw-dispatch-alist.

Cela signifie que vous pouvez appeler ace-window et frapper nau lieu d'un numéro de fenêtre pour revenir à la fenêtre précédente. Vous pouvez également vous lier aw-flip-windowà une autre clé.

Notez que cela ne retournera qu'à une fenêtre précédemment sélectionnée par ace-window. Si vous changez souvent de fenêtre avec d'autres commandes, vous voudrez peut-être une solution plus générale.

glucas
la source
4

Voici une commande simple, légèrement testée, qui vous fera basculer vers la dernière fenêtre visitée:

(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
la source
Je vous remercie! Ça marche. Cela vous dérange si j'en fais un paquet, avec attribution?
9000
Je vous en prie. Bien sûr, n'hésitez pas à l'utiliser dans un package, mais sachez que le code n'est pas (encore) très intelligent. Si vous passez à d'autres fenêtres avec des commandes telles que next-windowou other-window, le changement ne sera pas repris dans la recent-windowvariable. Il n'y a pas de crochet évident à utiliser, donc réparer cette partie peut impliquer de définir des conseils pour tout un tas d'autres fonctions.
Dan
1
Je pense que vous pourriez utiliser buffer-list-update-hook, qui est appelé lorsque la fenêtre active change (après select-window). Ce crochet est appelé dans d'autres cas mais pourrait être utilisé pour garder une trace de la dernière fenêtre.
glucas