Vue d’ensemble de la gestion des fenêtres dans Emacs
Réputation et potentiel de la gestion des fenêtres
- La gestion des fenêtres d’Emacs a mauvaise réputation
- Cela vient en grande partie de la combinaison d’un système de mise en page très flexible et très granulaire avec un contrôle assez brut
- Cela laisse de la place pour créer et utiliser des outils offrant de meilleures métaphores et de meilleures affordances pour manipuler les fenêtres
Options de base pour la gestion des fenêtres
other-window et la « fenêtre suivante »
other-window (C-x o) fournit l’expérience de base pour passer d’une fenêtre à l’autre
- C’est ce qui est enseigné dans le tutoriel Emacs, et cela fonctionne bien quand il y a peu de fenêtres
- La sélection des fenêtres parcourt l’ensemble du frame dans le sens horaire (approximativement)
windmove
windmove est une bibliothèque Emacs intégrée permettant de déplacer le focus entre les fenêtres selon une direction et de déplacer des buffers entre les fenêtres
- C’est une fonctionnalité attendue par les utilisateurs de Vim, et les utilisateurs de
evil-mode utilisent déjà Windmove
- On l’utilise en associant
windmove-left, -right, -up, -down à des touches liées aux directions
frames-only-mode
frames-only-mode permet de confier à l’OS la gestion des fenêtres Emacs
- Si tous les buffers s’ouvrent dans un nouveau frame, cela devient le travail du gestionnaire de fenêtres
- Cela rend les buffers Emacs équivalents aux fenêtres de l’OS, ce qui permet de les gérer avec les mêmes raccourcis
winum-mode
- Winum est l’évolution naturelle de l’effort nécessaire pour passer entre n fenêtres, de O(n) (
other-window) à O(√n) (windmove), puis à O(1)
- Il ajoute les numéros de fenêtre dans la mode line afin de pouvoir sélectionner une fenêtre par son numéro
- Quand le minibuffer est actif, il reçoit toujours le numéro 0
ace-window
- ace-window est l’outil ultime de contrôle des fenêtres Emacs au clavier
- Il place des « indices » en haut de chaque fenêtre, et saisir la touche correspondante déplace le focus vers cette fenêtre
- Il permet de « sélectionner » une fenêtre de manière générale, puis de laisser l’utilisateur décider quoi faire avec cette fenêtre
- En plus des actions fournies par défaut comme supprimer, déplacer ou échanger, scinder, afficher un buffer, etc., on peut ajouter des actions personnalisées
Utiliser la souris
- Les avantages de l’utilisation de la souris pour gérer les fenêtres sont immédiats et évidents
- Sélectionner une fenêtre est une extension naturelle de l’usage basique de la souris, et redimensionner une fenêtre est simple
- Les menus contextuels et le glisser-déposer sont très intuitifs
- Pour atténuer ses inconvénients, si vous utilisez déjà la souris pour d’autres tâches, piloter Emacs à la souris est en pratique le chemin de moindre résistance
transpose-frame (rotation, miroir et retournement)
- transpose-frame fournit des commandes pour faire pivoter ou refléter la disposition des fenêtres dans un frame
- On utilise souvent
rotate-frame, flip-frame, flop-frame en les associant à des touches appropriées
window-prefix-map
window-prefix-map est associé par défaut à C-x w et regroupe plusieurs commandes utiles de gestion des fenêtres
split-root-window-right et split-root-window-below scindent la fenêtre racine du frame
tab-detach et tear-off-window sont des commandes pratiques pour déplacer une fenêtre vers un nouvel onglet ou un nouveau frame
other-window-prefix
other-window-prefix propose une manière de dissocier la sélection de fenêtre de l’affichage d’un buffer et résout trois irritants liés aux fenêtres
- Beaucoup de commandes Emacs couplent étroitement l’action principale, le buffer et la fenêtre. Avec
other-window-prefix, on peut afficher le buffer d’une commande dans une autre fenêtre
- Avec
other-window-prefix, on peut sélectionner une fenêtre lors de l’activation d’objets comme des liens
- Avec
other-window-prefix, on peut ouvrir uniformément des objets « lien » sans avoir à s’adapter au fonctionnement ou à la personnalisation de chaque auteur de package
Sauvegarder et restaurer une configuration de fenêtres
window-configuration-to-register est un outil un peu grossier, mais parfait comme gros bouton rouge de réinitialisation
- On peut à tout moment utiliser cette commande pour enregistrer la configuration actuelle des fenêtres dans un registre, puis la restaurer avec
jump-to-register
- Avec
winner-mode, on peut demander à Emacs de conserver une pile des dispositions de fenêtres passées
Exploration approfondie
Comment faire des allers-retours
- Quel que soit le nombre de fenêtres ouvertes en même temps, dans la plupart des cas on ne fait qu’alterner entre deux fenêtres
- La commande
other-window-mru permet de basculer entre des paires de fenêtres
Améliorer other-window
- On peut faire en sorte que
other-window scinde le frame s’il n’y a qu’une seule fenêtre
- On peut faire défiler les fenêtres selon l’ordre du dernier usage plutôt que selon l’ordre spatial (package
switchy-window)
- On peut inverser la direction du changement de fenêtre à chaque appel pour alterner naturellement entre deux fenêtres
Faire de la magie avec les fenêtres via le dispatch de ace-window
ace-window fait pour les fenêtres ce que completing-read fait pour une liste de chaînes
aw-select est idéal pour les deux premières des trois étapes nécessaires pour appeler n’importe quelle action sur n’importe quelle fenêtre : filtrage puis sélection
ace-window-one-command permet de sélectionner une fenêtre avec ace-window, puis d’exécuter n’importe quelle commande simple dans cette fenêtre
ace-window-prefix est similaire à other-window-prefix, mais permet de choisir explicitement la fenêtre dans laquelle afficher le buffer de la commande suivante
Faut-il vraiment changer de fenêtre ?
- Le déplacement indépendant des fenêtres avec Avy est un cas particulier d’une idée plus générale
- En tant que conteneurs de texte, les fenêtres peuvent être une abstraction inutile
mark-ring et global-mark-ring suivent les positions visitées et permettent de se déplacer à travers les fenêtres si nécessaire
- On peut aussi épingler manuellement des positions à retrouver plus tard avec
point-to-register et jump-to-register
- Créer des signets et s’y déplacer offre de nombreuses options pour parcourir les fenêtres via des positions significatives qu’Emacs ou l’utilisateur ont repérées
Gérer les fenêtres de façon à ne pas avoir à interagir avec elles
display-buffer-alist et le comportement automatique des fenêtres permettent de résoudre le problème des fenêtres surgissantes incontrôlables
- Définir des règles pour tous les types de buffers que l’on voit chaque jour dans Emacs résout l’essentiel de la gestion des fenêtres
- Le problème de
display-buffer-alist n’est pas qu’il ne fonctionne pas, mais qu’il demande beaucoup de travail
- Le package Shackle masque les étrangetés de
display-buffer-alist et fournit une interface elisp simplifiée pour définir des règles de fenêtres
- Les distributions Emacs proposent généralement une interface simple pour définir ce genre de réglages
Popper, Popwin, shell-pop et vterm-toggle
- Popwin et Popper partent du constat que tous les buffers ne se valent pas
- Avec ces packages, on peut désigner des buffers popup utilisant des fenêtres auxiliaires et appeler ou retirer ces fenêtres à la demande
Ce qui manque
window-tree
- Il existe une différence fondamentale entre la manière dont Emacs représente les fenêtres et la manière dont les approches discutées plus haut les manipulent
- Les fenêtres d’un frame sont organisées en arbre : les nœuds feuilles sont les fenêtres « réelles », tandis que les autres sont des fenêtres « internes »
- Ajouter des commandes pour travailler sur l’arbre des fenêtres ouvrirait de nombreuses nouvelles possibilités
Intégrateur avec les gestionnaires de fenêtres en mosaïque
- Le modèle en arbre des fenêtres d’Emacs est presque identique à celui des gestionnaires de fenêtres en mosaïque manuels comme i3 ou bspwm
- La question se pose naturellement : pourquoi utiliser un autre gestionnaire de fenêtres en mosaïque à l’intérieur d’un gestionnaire de fenêtres en mosaïque ?
- Fournir dans Emacs une interface plus propre et unifiée pour l’intégration avec tous les gestionnaires de fenêtres pourrait grandement simplifier les choses
Perspectives
- Il existe de nombreuses façons de changer de fenêtre, de s’y déplacer, de les ignorer, de les créer, de les supprimer et de les manipuler, plusieurs moyens de contrôler à la volée l’affichage des fenêtres lors de l’appel de commandes, ainsi que des façons de travailler dans les fenêtres sans avoir à y penser du tout
- La gestion des fenêtres est moins complexe qu’ouverte
- Emacs fournit les ingrédients et quelques indications, et les ingrédients peuvent déjà servir de plat de base en eux-mêmes
- Mais avec un peu de cuisine, on peut en faire quelque chose de délicieux
L’avis de GN⁺
- La gestion des fenêtres est l’un des plus grands points faibles d’Emacs et manque de convivialité. Elle peut être déroutante, surtout pour les débutants.
- Les méthodes proposées peuvent atténuer les problèmes de gestion des fenêtres dans Emacs, mais ne constituent pas une solution fondamentale. Un système de gestion des fenêtres plus intuitif et plus simple d’utilisation est nécessaire.
- La gestion des fenêtres dans Emacs est très
1 commentaires
Avis Hacker News
Voici un résumé des commentaires de Hacker News :
ace-window,ace-window-display-modeetframes-only-mode.windmove-modeet à utiliser `(windmove-default-keybindings 'control)`` pour permettre le déplacement entre fenêtres avec Ctrl + touches directionnelles.zygospore, qui permet de fermer des fenêtres avecC-x 1, puis de restaurer la disposition précédente des fenêtres en appuyant de nouveau surC-x 1.hledger-balance-sheeten laissant le fichier journal ouvert à gauche et en affichant le résultat à droite dans un panneau divisé occupant 30 % de l’espace.