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?


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

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.