Comment basculer rapidement d'une fenêtre à l'autre?


92

Comment changer rapidement de fenêtre?

J'ai souvent plusieurs fenêtres ouvertes et j'ai besoin de basculer entre elles. En ce moment, j'utilise C-x opour arriver à celui que je veux. Existe-t-il un flux de travail plus efficace pour cela?


Réponses:


63

Je préfère évidemment as-window pour cela. Vous pouvez basculer entre les fenêtres et les cadres visibles. C'est dans MELPA, vous pouvez l'installer rapidement. La seule chose à faire est de le lier:

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

Vous pouvez également utiliser un accord de clé plus court, car le changement de fenêtre est une tâche courante:

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

Résumé de ace-window

C'est un remplacement instantané pour other-window. Contrairement à ce dernier, il n'est jamais nécessaire d'appeler ace-windowdeux fois ou plus pour sélectionner une fenêtre: vous sélectionnez la fenêtre de votre choix lors d'un appel (éventuellement sur plusieurs cadres).

En plus de changer de fenêtre, vous ace-windowpouvez en faire plus (supprimer ou changer de fenêtre, etc.), voir le fichier LISEZMOI .


2
C'est intéressant. J'ai utilisé ace-windowpuis vu switch-windowqui semble faire à peu près la même chose, sauf que les lettres sont plus prononcées. semble drôle nous avons les deux forfaits.
milkypostman

Vous avez raison. Il n'y a que de petites différences entre eux. C'est un problème auquel nous devons faire face lorsque nous avons un référentiel de 2000 paquets. Je n'étais pas au courant switch-windowavant de me soumettre ace-windowà MELPA.
ABO-abo

1
merci pour ace-window, il a plus de personnalisation que d'autres paquets, je suppose. Néanmoins, l’on pourrait peut-être aider à l’avenir si l’on souhaite associer une fonction qui ressemblerait à l’action d’échange intelligent, mais grignoterait cette fenêtre, ce qui donnerait une fenêtre plus grande au point et une fenêtre choisie de taille plus petite fenêtre vers le haut). Le rapport doit être déterminé dans ce cas comme un demi, un quart ou un tiers.
doctorat le

4
S'il vous plaît envisager d'ajouter une description. Vous dites simplement que vous l'aimez et que vous vous y connectez. Cela en fait essentiellement une réponse sous forme de lien uniquement.
Drew

4
Quel est l'avantage d'As-Window? Pourquoi devrais-je l'utiliser sur les 14 autres solutions proposées sur cette page?
Gilles

104

Une façon est d'utiliser windmove. Avec ses raccourcis clavier par défaut, il permet de basculer vers la fenêtre à côté de la fenêtre active.

Il est construit dans Emacs, il n’est donc pas nécessaire d’installer quoi que ce soit; activez-le simplement avec la configuration minimale suivante dans votre fichier init:

(windmove-default-keybindings)

Vous pouvez ensuite passer aux fenêtres voisines en utilisant les touches suivantes (où la flèche utilisée définit intuitivement la direction dans laquelle vous vous déplacez): S-<left>, S-<right>, S-<up>, S-<down>.


Si vous préférez utiliser un autre modificateur au lieu de shift, vous pouvez le fournir comme argument windmove-default-keybindings. Par exemple:

(windmove-default-keybindings 'meta)

ou

(windmove-default-keybindings 'control)

Plus d'infos sur Emacs Wiki .


16
Cela devrait être la réponse acceptée!
bonhomme

OMG, pourquoi aucun tutoriel ne mentionne Maj + touches fléchées pour déplacer la fenêtre! C'est tellement mieux que ctrl + o
Didier A.

Je dirais que certaines des autres réponses ici contiennent une configuration redondante éolienne. Cela vaut peut-être la peine de mettre à jour la réponse pour indiquer que la fonction accepte la touche de modification comme argument, par exemple (windmove-default-keybindings 'meta)comme suggéré sur EmacsWiki.
Metaturso

Cela crée beaucoup de conflits avec d'autres raccourcis clavier (ou avec les gestionnaires de fenêtres). Je préfère Ace Window.
azzamsa

J'utilise quelque chose de similaire (je me déplace avec Shift-arrow) , mais quand vous avez un grand moniteur avec beaucoup de scissions, un tel mouvement devient rapidement difficile à manier. Il serait plus intéressant d’énumérer les fenêtres / scissions. Comme ace-window, mais avec moins de pressions sur les touches et un algorithme évident pour déterminer immédiatement le nombre souhaité.
Bonjour Angel

22

Vous pouvez vous connecter other-windowà une séquence de clé plus facile à saisir.

Par exemple, je suis C-.lié à other-window, et C-,lié à aller à la fenêtre précédente.

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

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

Ceci est particulièrement utile pour déplacer plusieurs fenêtres. une fois que vous maintenez la touche Control enfoncée, il vous suffit d'appuyer sur un seul bouton pour passer à la fenêtre suivante. C'est beaucoup plus facile que trois pressions de touches par coup.


2
+1 C-x opour other-windowest l'un des rares prétendants au titre de "pire raccourci emacs par défaut". Ma solution (similaire à ZCK) était de lier de nouveau other windowà une séquence de touches plus facile (chemin) - je l' ai lié à C-;(et mon Caps-Lockest échangé avec Ctrldonc tout ce qu'il faut est un robinet rapide des petits doigts). Btw, je suis totalement dépendant de certaines fonctionnalités de helmet icicles(c.-à-d., Je ne suis pas "anti-packages" ou quoi que ce soit); Je pense juste qu'une solution simple fonctionne mieux ici.
iceman

2
+1 Ceci devrait être la réponse acceptée ET la réponse la plus simple aussi (hélas, une telle chose n'existe pas encore sur StEx). Fonctionne hors de la boîte, balance parfaitement, simple à mémoriser. Ce dernier que j’ai trouvé particulièrement important dans la jungle d’Emacs. Après y avoir survécu plus de 20 ans, je me retrouve parfois assoiffé dans le désert de vi ...
Andreas Spindler

Simple, facile à utiliser, facile à mettre en œuvre. Cela nécessite plus de votes.
stewSquared

1
C'est aussi ce que je fais. J'utilise M-opour other-window. Certains modes ont déjà M-oliaison, notamment diff-mode, ggtag-modeet ibuffer-mode. Vous devez le dissocier manuellement dans chaque mode. unbind-keyfourni par bind-key.elest très utile.
Yasushi Shoji

J'utilise M-oaussi, et ai M-Olié ace-windowpour quand j'ai besoin de la puissance supplémentaire.
glucas

14

fenêtre-numérotation.el!

J'attribue le raccourci clavier ", 1", ", 2", ", 3" pour changer de fenêtre (veuillez noter que j'utilise le mode maléfique)

De plus, le numéro de la fenêtre est affiché sur la ligne de mode en couleur PINK, souligné.

C'est un indice visuel que vous ne pouvez jamais ignorer,

C'est le moyen le plus rapide de changer de fenêtre.

vérifier https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el et https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el pour ma configuration.

Sylvain Benner a adopté mon idée dans spacemacs mais les combinaisons de touches sont différentes . Donc, si vous utilisez des spacemacs, vous obtenez immédiatement la solution la plus rapide.


2
Ouaip. Ce concept est génial. J'utilise un paquet window-numberavec M-<num>pour changer rapidement de fenêtres b / w. Concept similaire à celui-ci
unperson325680

1
Notez que window-numbering.el est déconseillé en faveur de winum , qui est ici . FWIW la numérotation de la fenêtre pour moi n'a même pas fonctionné.
Salut-Angel

Je pourrais bientôt basculer vers le winum. Mais la numérotation des fenêtres fonctionne toujours bien avec emacs24 / 25/26.
chen bin

10

Sans utiliser de module complémentaire, vous pouvez continuer à utiliser C-x oun préfixe facultatif pour ignorer autant de fenêtres. Ex.: C-u 1 C-x oIra à la fenêtre suivante dans l’ordre (c’est-à-dire ce que vous obtiendrez avec plain C-x o), C-u 2 C-x opasse deux fenêtres plus, C-u 3 C-x otrois fois et ainsi de suite.

Un extrait de la other-windowdocstring (la fonction appelée par C-x o:

COUNT spécifie le nombre de fenêtres à ignorer, en commençant par la fenêtre sélectionnée, avant de faire la sélection. Si COUNT est positif, sautez les fenêtres COUNT. Si COUNT est négatif, sautez les fenêtres -COUNT à l'envers. COUNT zéro signifie que vous ne sautez aucune fenêtre. Sélectionnez donc la fenêtre sélectionnée. Dans un appel interactif, COUNT est l'argument de préfixe numérique. Retour à zéro.


Quand vous avez plusieurs fenêtres, quel ordre suivent-elles?
Stsquad

L'ordre correspond à l'ordre de la fenêtre cyclique .
Dan

2
hmm "L'ordre est déterminé par une traversée d'abord en profondeur de l'arbre de la fenêtre du cadre, récupérer les fenêtres actives qui sont les noeuds feuilles de l'arbre" n'est pas la description la plus utile pour le cerveau humain qui essaie de deviner quelle fenêtre est proche ou combien de sauter. J'imagine que c'est pourquoi j'utilise as-window.
Stsquad

2
@stsquad: oh, je suis d'accord avec toi - ça me fait tourner la tête aussi. Je mets cette réponse ici dans un souci de complétude.
Dan

8

Certaines personnes se souviendront peut-être de l'éditeur Brief (assez curieusement produit par une société appelée Underware).

Il y avait un moyen intéressant de basculer entre les fenêtres visibles. La flèche M déplacerait le curseur dans la fenêtre directement dans l'alignement de la direction de la touche fléchée.

Donc, je cartographié les winmove-left, winmove-right, winmove-upet winmove-downfonctions M-left, M-right, M-upet les M-downtouches comme suit dans mon fichier .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

Maintenant, je peux passer facilement d’une fenêtre à l’autre, quelle que soit l’encombrement de ma configuration.


N'est-ce pas plus ou moins la réponse de Francesco?
Dan

Je suis d'accord. Je n'avais pas remarqué avant de poster le mien.
user2542

2
Un moyen beaucoup plus rapide pour obtenir ces raccourcis clavier est (windmove-default-keybindings 'meta)!
Omar

8

Si vous utilisez Icicles puis C-x opermet de sélectionner les fenêtres par nom (ou en faisant du vélo).

  • Sans préfixe arg, C-x oest identique à l’habitude, à other-windowmoins que le cadre n’ait qu’une seule fenêtre, auquel cas c’est le cas other-frame.

  • Avec un préfixe arg, C-x oest une commande multiple qui vous permet de naviguer entre les fenêtres ou les cadres par nom (ou par cycle). La navigation entre les fenêtres utilise plusieurs commandes icicle-select-window. navigation parmi les utilisations de cadres icicle-select-frame.

La navigation utilisée dépend du préfixe arg:

  • Zéro préfixe arg (par exemple C-0): Si le cadre sélectionné a plusieurs fenêtres, il en est ainsi icicle-select-window, les fenêtres se trouvant dans le même cadre que les candidats. Sinon (cadre à fenêtre unique), c’est icicle-select-frame.

  • C-u: Si le cadre sélectionné a plusieurs fenêtres, il en est ainsi icicle-select-window, les fenêtres de tous les cadres visibles étant candidates. Sinon, c'est icicle-select-frame.

  • C-u C-u: icicle-select-window, avec des fenêtres de tous les cadres en tant que candidats (y compris les cadres iconifiés ou cachés).

Comme toujours dans Icicles , vous pouvez combiner (a) l' achèvement , la saisie de texte pour limiter l'ensemble des candidats correspondant (noms de fenêtre ou de cadre, dans ce cas), avec (b) le cyclisme (parmi les candidats correspondant).


4

Pensez à utiliser un accord clé pour sauter rapidement entre les fenêtres. Je trouve cela beaucoup plus rapide que de chercher une touche de modification (et de moins forcer mes mains également).

Mon choix de paquet à utiliser est ace-window, ce qui vous permet de naviguer plusieurs fenêtres plus facilement que juste other-window.

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

Il est évident que d'utiliser ce dont vous avez besoin key-chordet ace-window, les deux sont disponibles en Melpa.


2
N'est-ce pas plus ou moins la réponse de @ abo-abo?
Dan

1
@Dan sa n'utilise pas d'accord-clé, remarquez le manque de méta-clés ou de super-clés dans l'accord. Que vous utilisiez as-window / quelque chose d'autre soit un peu sans importance, le but était de donner une réponse qui n'utilise pas de touches de modification pour une opération aussi couramment utilisée.
Zavior

1
J'ai vu cela, mais j'ai posé la question parce que ace-windowfait le travail comme dans la réponse de @ abo-abo. Il me semble que, dans ce contexte, la combinaison de touches à utiliser aurait plus de sens comme commentaire plutôt que comme réponse. Juste mes deux cents.
Dan

@Dan, dans l'ensemble, la question portait sur le changement rapide de fenêtre et je ne pense pas que cette solution ait encore été évoquée. Clarifié la réponse un peu à ce sujet.
Zavior

@Zavior soulève un point important. La question concerne le changement rapide de fenêtre pour lequel la forme de la reliure est très importante. Quelle que soit la bibliothèque que vous préférez, key-chordpermet de relier des combinaisons de touches très accessibles. La liaison d'exemple de xoest plus rapide que C-x o(profondeur de un contre deux). Cette réponse pourrait être reformulée de manière à souligner que la réponse est orthogonale aux autres réponses sur la sélection de fonction (et qu’elle ace-windown’est qu’un des nombreux choix pouvant être liés de la manière décrite). Gardez cette réponse distincte!
ebpa

3

Quelques bonnes réponses ici, je suis aussi un fan de WinMove, mais je le lie à C- car le mode org utilise M- pour manipuler les en-têtes.

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

Là où ça devient vraiment bon, c'est si vous le combinez avec Hydra . En suivant les exemples sur leur wiki, j'ai créé mon propre monstre:

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

Cela me permet de changer de fenêtre, de le redimensionner, de déplacer les tampons de fenêtre en fenêtre, de faire défiler les tampons, de tuer les tampons et même d'annuler les configurations de fenêtre via le mode gagnant, et intègre également la barre. Pour quitter l'hydre, appuyez simplement sur la flèche ou sur une autre touche ne se trouvant pas dans l'hydre. Vous pouvez trouver les fonctions "hydra-move" sur les exemples d'hydra. L'atout majeur de l'hydra est que je n'ai pas à me souvenir de tous ces raccourcis clavier et de son "confort", donc une fois que vous êtes dans l'hydra, tout est disponible sous forme de clé unique. presse.


1
Un moyen plus rapide d’obtenir les combinaisons de touches que vous avez mentionnées au début est le suivant (windmove-default-keybindings 'control):
Omar

1

Si vous utilisez evil-mode, vous pouvez simplement utiliser un préfixe numérique avec C-w C-w( evil-window-next) pour sélectionner la fenêtre souhaitée. So: 1 C-w C-wsélectionne la première fenêtre par ordre cyclique, 3 C-w C-wsélectionne la troisième fenêtre par ordre cyclique, etc.


Il semble que cela devrait juste être combiné avec votre autre réponse : c'est la même chose, juste avec des liaisons spécifiques au mal.
npostavs

1

Ace Jump vous permet de naviguer dans votre pointeur vers tous les mots d'un écran, quelle que soit la fenêtre ou le cadre dans lequel ils se trouvent. Ce n'est donc pas si différent d'utiliser Ace Window ou Switch Window.

Un avantage pourrait être que, tout en sautant des fenêtres, vous pouvez également placer votre pointeur avec une certaine précision.

Je trouve toujours cela un peu lourd ou gênant, et j'utilise windmoveplus, parce que c'est très simple, mais j'utilise quand même Ace Jump lorsque je lis dans une autre fenêtre ou un autre cadre et que je veux me déplacer.


1

Comme d'habitude, il y a cent façons différentes d'y parvenir. Ma façon préférée est d'utiliser NumberedWindows . J'ai ensuite défini le raccourci clavier suivant à l'aide des touches Super et 1-9.

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

Je vais un peu plus en détail sur ce sujet avec un de mes articles récents que vous pouvez lire dans Afternoon Coder .


En quoi cela diffère-t-il de la réponse de chen bin ?
Gilles

A un exemple de configuration.
Travis

-1

Vous pouvez également décider d’utiliser le commutateur-fenêtre pour remplacer visuellementC-x o


1
Quel est l'avantage du switch-window? Pourquoi devrais-je l'utiliser sur les 14 autres solutions proposées sur cette page?
Gilles

Comment dit tu devrais? Emacs est basé sur des alternatives, la personnalisation et la liberté de décision
Csantosb

2
Ce n'est ni ici ni là-bas. Pourquoi quelqu'un choisirait-il cette alternative? Pourquoi déciderait-on d'utiliser switch-windowplus que tous les autres?
Gilles
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.