1 points par GN⁺ 2024-05-13 | 1 commentaires | Partager sur WhatsApp
  • La gestion des fenêtres dans Emacs repose sur une structure souple où buffers et fenêtres sont séparés, sur laquelle viennent se greffer des manipulations de base un peu rustiques, si bien que l’utilisateur doit combiner outils et habitudes pour construire son flux de travail
  • L’article ne se concentre ni sur les règles display-buffer ni sur les espaces de travail à base d’onglets, mais sur les manipulations manuelles dans une même frame Emacs : déplacement du focus, placement des buffers, division·suppression et tâches temporaires
  • other-window, windmove, winum, ace-window, la souris, transpose-frame, window-prefix-map, other-window-prefix et winner-mode se répartissent respectivement la navigation cyclique, directionnelle, par numéro, par indices visuels, la transformation de layout et la restauration
  • Avec ace-window et Avy, on peut sélectionner une fenêtre précise puis lancer une commande, ou sauter directement à un emplacement de texte afin de réduire les changements de fenêtre eux-mêmes
  • La gestion des fenêtres d’Emacs ressemble moins à un système figé et complexe qu’à un problème ouvert ; display-buffer-alist, Popper·Popwin, la manipulation de l’arbre des fenêtres et l’intégration avec un WM tiling sont puissants, mais coûteux à configurer et pas sans angles morts

Ce qu’Emacs appelle la gestion des fenêtres

  • Dans Emacs, une fenêtre (window) est un viewport ou panneau à l’intérieur d’une frame, tandis qu’un buffer est un bloc de texte continu qui peut correspondre à un fichier… ou non
  • Beaucoup d’IDE et d’éditeurs fusionnent de fait les concepts de fenêtre et de buffer pour réduire la charge cognitive, mais Emacs les sépare, ce qui permet une disposition plus souple
    • Voir deux fois le même fichier est simple
    • Les buffers sans correspondance directe avec un fichier se gèrent naturellement
    • Les indirect buffers d’Emacs ressemblent à une copie « vivante » de l’ensemble du buffer
  • Cette séparation a aussi un coût pour les nouveaux utilisateurs
    • Il faut placer les fenêtres où on le souhaite à l’intérieur de la frame
    • Il faut mettre le buffer voulu dans la fenêtre voulue
    • Au début, la charge de manipulation se fait sentir avant les avantages de cette séparation

Ce que cet article ne couvre pas

  • Les règles automatiques d’affichage des buffers qui contrôlent totalement display-buffer ne sont pas le sujet principal
  • Les onglets, espaces de travail, l’isolation des buffers et la persistance de session sont aussi hors du périmètre principal
  • Les alternatives radicales qui font d’Emacs une sorte de gestionnaire de fenêtres à part entière restent elles aussi en dehors du texte
    • Edwina impose un layout de tiling automatique de type master-and-stack façon DWM
    • HyControl fournit entre autres un panneau de contrôle pour les actions sur les layouts de fenêtres et un affichage en grille homogène
  • Le vrai sujet, ce sont les manipulations manuelles du quotidien
    • Changer le focus entre les fenêtres
    • Déplacer des buffers entre fenêtres
    • Diviser et supprimer des fenêtres
    • Contrôler la fenêtre cible d’affichage pendant l’exécution d’une commande

Déplacement de base : other-window et la « fenêtre suivante »

  • other-window est la commande de base pour changer de fenêtre, apprise dans le tutoriel Emacs ; son raccourci par défaut est C-x o
  • L’ordre de sélection tourne globalement dans le sens horaire à l’intérieur de la frame
    • Avec peu de fenêtres, c’est simple et suffisamment pratique
    • Plus il y a de fenêtres, plus il faut répéter la commande pour atteindre l’emplacement voulu
  • Il existe aussi quelques ajustements pratiques
    • On peut la lier à une touche plus facile à presser, comme M-o
    • Un argument numérique permet de sauter plusieurs positions ou de se déplacer en sens inverse
    • En activant repeat-mode, on peut répéter avec C-x o o o... ou M-o o o...
  • En définissant le paramètre de fenêtre no-other-window, other-window ignore certaines fenêtres
    • C’est notamment pour cela que des fenêtres latérales de type gestionnaire de fichiers comme dired-sidebar ou dirvish-side sont exclues de other-window
  • La notion de « fenêtre suivante » sert aussi de cible par défaut à des commandes agissant sur une autre fenêtre, comme scroll-other-window

Déplacement directionnel : windmove

  • windmove est une bibliothèque intégrée qui déplace le focus entre fenêtres selon une direction
    • Cela se rapproche du déplacement gauche·droite·haut·bas attendu par les utilisateurs de Vim
    • Les utilisateurs d’evil-mode s’appuient aussi sur Windmove en interne
  • On peut associer windmove-left, windmove-right, windmove-up et windmove-down à WASD, HJKL, aux flèches, etc.
  • Les commandes windmove-swap-states-left/right/up/down échangent les buffers des fenêtres selon une direction
    • Dans ce cas, le focus se déplace avec le buffer
  • La famille windmove-delete-* permet aussi de supprimer une fenêtre dans une direction donnée, mais l’article présente plus bas d’autres approches
  • Dans un environnement WM tiling, on peut unifier les mêmes touches pour naviguer entre les fenêtres internes d’Emacs et celles de l’OS
    • Pour un exemple d’intégration Emacs+i3wm, voir i3 integration
    • Un exemple de configuration pour qtile se trouve dans emacs-wm.el

Confier les fenêtres Emacs aux fenêtres de l’OS

  • frames-only-mode ouvre tous les buffers dans de nouvelles frames plutôt que dans des fenêtres Emacs, laissant ainsi le gestionnaire de fenêtres du système les administrer
  • Cette approche met les buffers Emacs au même niveau que les fenêtres de l’OS, ce qui permet de gérer les deux avec les mêmes touches
  • Des outils comme Avy, winum, ace-window ou scroll-other-window peuvent s’appliquer non seulement aux fenêtres, mais aussi à l’ensemble des frames
  • Certaines commandes Emacs supposent qu’elles peuvent découper librement les frames, ce qui peut créer des cas particuliers
    • C’est particulièrement fréquent avec des commandes d’org-mode
  • Je n’ai pas d’expérience d’utilisation de frames-only-mode avec un compositeur Wayland

Sélectionner instantanément avec des numéros et des indices

  • winum affiche le numéro des fenêtres dans la mode line et permet de sélectionner une fenêtre par son numéro
    • Là où other-window est proche de O(n) et où windmove dépend de la disposition spatiale, winum offre un accès proche de O(1) si l’on connaît le numéro
    • Appeler la commande de sélection avec un argument prefix négatif supprime la fenêtre correspondante
    • Quand le minibuffer est actif, il reçoit toujours le numéro 0
    • Fonctionne à travers les frames Emacs
  • Le raccourci par défaut C-x w <n> peut être long ; il existe un exemple de configuration qui utilise M-0 à M-9 pour sélectionner les fenêtres
  • ace-window est présenté comme un outil puissant de contrôle des fenêtres Emacs au clavier
    • Il affiche des indices sur chaque fenêtre, puis permet de la sélectionner en appuyant sur la touche correspondante
    • En activant ace-window-display-mode, on peut afficher en permanence les indices dans la mode line, comme avec winum
    • Appuyer sur ? ouvre le menu de dispatch
  • Le point fort de ace-window n’est pas seulement la sélection, mais le fait de choisir une fenêtre puis d’exécuter une action
    • Supprimer une fenêtre
    • Déplacer et échanger des fenêtres
    • Scinder des fenêtres
    • Afficher un buffer précis
    • Appliquer une opération à une autre fenêtre sans quitter la fenêtre sélectionnée

Souris et transformations de layout

  • Dans Emacs, la souris est naturellement adaptée à la sélection de fenêtres, au redimensionnement, aux menus contextuels et au glisser-déposer
    • context-menu-mode et la barre de menus améliorent la découvrabilité
  • Si vos mains ont déjà quitté le clavier, piloter Emacs à la souris peut être la voie offrant le moins de friction
  • Certaines opérations peuvent aussi se faire par gestes de souris
    • Scission verticale ou horizontale de la frame
    • Suppression de fenêtre
    • Rotation entre les buffers d’une fenêtre
    • Échange de fenêtres vers la droite ou vers la gauche
    • Bascule entre les deux derniers buffers dans une fenêtre
  • En configurant mouse-autoselect-window, on peut activer un comportement de type focus-follows-mouse
  • transpose-frame fournit des commandes pour faire pivoter ou retourner le layout des fenêtres d’une frame
    • rotate-frame, flip-frame et flop-frame sont cités comme les commandes les plus utiles
    • transpose-frame lui-même, qui effectue une transposition selon la diagonale principale, est jugé peu utile en pratique

window-prefix-map et l’arbre des fenêtres

  • window-prefix-map est l’ensemble des commandes de gestion des fenêtres liées au raccourci par défaut C-x w d’Emacs
  • split-root-window-right et split-root-window-below divisent la fenêtre racine de la frame
    • Elles sont associées respectivement à C-x w 3 et C-x w 2
    • Contrairement aux commandes de scission classiques, qui découpent davantage la fenêtre courante, elles sont utiles pour créer un espace de travail séparé
  • Les fenêtres d’Emacs sont organisées sous forme d’arbre
    • Les vraies fenêtres sont des nœuds feuilles
    • Une scission transforme une feuille en nœud parent de deux fenêtres
    • Cela ressemble à l’organisation de gestionnaires de fenêtres en tiling manuel comme i3 ou bspwm
  • tab-window-detach et tear-off-window déplacent la fenêtre courante vers un nouvel onglet ou une nouvelle frame
    • Leurs raccourcis par défaut, C-x w ^ t et C-x w ^ f, sont jugés longs
    • On peut les remplacer par une action de dispatch ace-window ou par un binding souris

other-window-prefix : changer où la prochaine commande affichera son résultat

  • other-window-prefix est une commande intégrée liée à C-x 4 4 qui fait afficher le buffer de la prochaine commande dans la fenêtre suivante
  • Cette commande sépare l’action qui affiche un buffer du choix de la fenêtre cible
    • Cela évite d’avoir à mémoriser à chaque fois des familles de commandes comme find-file-other-window, find-file-other-tab ou find-file-other-frame
    • On peut ajouter ce préfixe devant des commandes de base comme find-file, find-file-read-only ou switch-to-buffer pour ne changer que l’emplacement d’affichage
  • Dans l’exemple avec Forge, cela permet d’éviter que la fenêtre courante soit écrasée lorsqu’on appuie sur RET dans la liste des issues
  • Cela fournit aussi un comportement uniforme quand chaque package a sa propre façon d’« ouvrir dans une autre fenêtre », comme Magit, Org mode, Notmuch, Elfeed ou EWW
  • Il existe aussi des préfixes associés
    • same-window-prefix force le buffer de la prochaine commande à s’ouvrir dans la fenêtre courante
    • other-frame-prefix force l’ouverture dans une nouvelle frame
    • other-tab-prefix force l’ouverture dans un nouvel onglet

Enregistrer et restaurer des configurations de fenêtres

  • window-configuration-to-register est la commande intégrée qui enregistre la configuration actuelle des fenêtres dans un registre ; son raccourci par défaut est C-x r w
  • jump-to-register restaure une configuration enregistrée ; son raccourci par défaut est C-x r j
  • Au niveau Elisp, on peut stocker le résultat de current-window-configuration dans une variable puis l’appliquer avec set-window-configuration
    • En l’enregistrant sur disque via prin1, persist ou multisession, on pose les bases d’une restauration entre sessions
    • En revanche, le fait de restaurer aussi la position du curseur dans chaque fenêtre peut être un comportement généralement indésirable
  • Il existe aussi des options « oups » qui empilent automatiquement les anciennes configurations
    • winner-mode : quand on n’utilise pas les onglets, winner-undo et winner-redo permettent d’annuler ou de réappliquer les modifications de configuration des fenêtres
    • tab-bar-history-mode : fournit une pile d’historique distincte pour chaque onglet
    • undelete-frame-mode et tab-undo : restaurent une frame ou un onglet fermé par erreur
  • Utiliser winner-undo à chaque fois qu’Emacs affiche un buffer au mauvais endroit et qu’il faut réparer ensuite tient davantage du palliatif
    • Le vrai problème est que les règles d’affichage des buffers ne sont pas configurées comme on le souhaite

Optimiser pour les deux fenêtres entre lesquelles on navigue le plus

  • En pratique, même avec plusieurs fenêtres à l’écran, on navigue le plus souvent entre deux fenêtres
    • Code & REPL
    • Code & Grep
    • Prose & Notes
    • Listing & Item
  • Les autres fenêtres peuvent servir de zones de référence qu’on consulte souvent sans presque jamais y basculer : documentation, infos de debug, logs, sorties de commande, sommaire, explorateur de fichiers, aperçu, etc.
  • Il existe un exemple de other-window-mru utilisant get-mru-window pour basculer vers la fenêtre utilisée le plus récemment
    • Quelle que soit la façon dont on choisit la deuxième fenêtre — souris, ace-window, winum, etc. — on peut ensuite faire l’aller-retour rapidement
  • On peut aussi améliorer other-window lui-même
    • Faire en sorte que s’il n’y a qu’une seule fenêtre, elle se scinde automatiquement
    • Faire défiler les fenêtres selon l’ordre d’utilisation récente, comme switchy-window
    • Inverser le sens à chaque appel non consécutif, comme avec other-window-alternating, pour rendre l’aller-retour entre deux fenêtres plus naturel

Étendre ace-window autour de l’exécution de commandes

  • ace-window permet, via aw-select, d’utiliser séparément l’étape de sélection d’une fenêtre
  • En exécutant ensuite l’opération voulue sur la fenêtre renvoyée par aw-select, on peut créer le schéma « sélection de fenêtre → exécution de l’action → conservation de la fenêtre d’origine »
  • Les commandes d’exemple sont les suivantes
    • ace-tear-off-window : détache dans une nouvelle frame la fenêtre choisie avec ace-window
    • ace-tab-window-detach : déplace dans un nouvel onglet la fenêtre choisie
  • ace-window-one-command permet d’exécuter une commande arbitraire unique dans la fenêtre sélectionnée
    • On choisit d’abord une fenêtre avec ace-window
    • Puis on lit une séquence de touches pour exécuter la commande correspondante
    • Cela permet d’appliquer une opération à une autre fenêtre sans changer la fenêtre actuellement sélectionnée
  • ace-window-prefix fonctionne comme une version plus directe de other-window-prefix
    • On choisit directement avec ace-window la fenêtre cible dans laquelle la prochaine commande affichera son buffer
    • Si nécessaire, on peut créer à la volée une nouvelle fenêtre via une action ace-window, puis y afficher le buffer
    • Le raccourci proposé est C-x 4 o

Faut-il vraiment changer de fenêtre ?

  • Les objectifs d’un changement de fenêtre se divisent globalement en deux catégories
    • Switch and stay : continuer à éditer ou à travailler dans la fenêtre de destination
    • Switch and return : faire brièvement défiler, rechercher, copier ou supprimer, puis revenir à la position d’origine
  • Dans le premier cas, Avy peut fusionner le changement de fenêtre et le déplacement du curseur en une seule action
    • avy-goto-char-timer traite les différentes fenêtres et frames Emacs visibles à l’écran comme un seul ensemble de cibles de saut
    • En sautant vers une chaîne ou une position de caractère précise, la fenêtre change automatiquement aussi
    • Si Avy ne traverse pas les fenêtres et les frames, il faut vérifier le réglage avy-all-windows
  • pop-global-mark permet de revenir à la position précédente et peut, si nécessaire, entraîner aussi un changement de fenêtre
    • Par défaut, il change de buffer dans la fenêtre courante ; il existe donc un advice pour lui faire utiliser pop-to-buffer
  • Dans le second cas, on peut automatiser le flux « changement → action → retour » en l’encapsulant dans une commande
    • ace-window-one-command est une méthode générique pour cela
    • Pour certaines actions, on peut créer des commandes dédiées ou des macros

Défilement, recherche et changement de buffer dans une autre fenêtre

  • scroll-other-window et scroll-other-window-down font défiler une autre fenêtre sans quitter la fenêtre courante
    • La cible par défaut est la « fenêtre suivante » dans le sens horaire depuis la fenêtre actuelle
    • S’il y a plus de deux fenêtres, ce peut être une autre fenêtre que celle de référence attendue qui défile
  • On peut modifier la règle de sélection de la cible de défilement en configurant other-window-scroll-default
    • Avec get-lru-window, c’est la fenêtre la moins récemment utilisée qui défile
    • Avec get-mru-window, on peut cibler la fenêtre la plus récemment utilisée
  • En configurant other-window-scroll-buffer, on peut désigner comme cible de défilement la fenêtre affichant un buffer précis
    • Cette option est surtout présentée comme utile aux auteurs de packages
  • L’exemple isearch-other-window lance une recherche dans la fenêtre cible du défilement, puis revient à la fenêtre d’origine une fois la recherche terminée
    • Un exemple montre son usage avec un shell et un buffer Man
  • next-buffer, previous-buffer et switch-to-buffer peuvent aussi être étendus pour s’exécuter dans une autre fenêtre en combinant un argument préfixe avec other-window-for-scrolling
    • En créant une keymap pour repeat-mode, on peut faire défiler ou sélectionner en continu les buffers d’une autre fenêtre avec n, p et b

master-mode, scroll-all-mode, with-other-window

  • master-mode désigne le buffer courant comme « master » et les autres comme « slave », ce qui permet d’envoyer des actions au buffer slave sans quitter la position actuelle
    • Globalement, c’est jugé moins transparent que l’approche fondée sur other-window-scroll-default décrite plus haut
    • Via master-says, on peut créer des touches qui exécutent des actions arbitraires comme recenter dans le buffer slave
  • scroll-all-mode lie entre elles les actions de défilement de toutes les fenêtres d’une frame
    • C’est utile quand on veut synchroniser plusieurs vues de fenêtres
  • La macro with-other-window est un helper Elisp qui exécute le code de son corps dans la fenêtre choisie par other-window-for-scrolling
    • Elle permet de créer simplement des commandes comme isearch-other-window ou isearch-other-window-backwards
    • Elle sert de pendant Elisp à l’interactif ace-window-one-command

Stratégies pour réduire le nombre de fenêtres

  • Les interfaces modernes d’éditeurs convergent en général vers une fenêtre principale unique, une barre d’onglets en haut, une barre latérale à gauche pour les répertoires ou le sommaire, un panneau droit optionnel et un terminal en bas
  • On peut créer une telle disposition dans Emacs, mais il est aussi possible de se concentrer sur un seul buffer à l’écran et de remplacer les changements de fenêtre par des changements de buffer
  • Se limiter à deux fenêtres permet déjà de conserver l’essentiel de cette simplicité tout en utilisant la seconde comme référence en direct
    • La configuration par défaut d’Emacs prend déjà assez bien en charge ce schéma via des commandes comme scroll-other-window
  • Il existe aussi une stratégie qui consiste à ignorer les fenêtres en ne les voyant que comme des conteneurs de texte
    • On saute directement vers une position de texte à l’écran avec Avy
    • On remonte aux positions précédentes avec mark-ring et global-mark-ring
    • dogears peut fournir une interface plus fine pour revisiter ces positions
  • Pour fixer manuellement des positions, on peut utiliser point-to-register et jump-to-register, et pour un historique plus permanent, bookmark-set et bookmark-jump

Règles d’affichage automatiques et gestion des popups

  • display-buffer-alist est une variable qui associe les buffers et les règles quand du code Elisp tente d’afficher un buffer, afin de déterminer comment celui-ci doit être montré
  • En théorie, définir des règles de taille, position, rôle et focus pour chaque type de buffer vu au quotidien résout une grande partie de la gestion des fenêtres
  • Le problème, c’est le coût de configuration
    • prédicats sur les buffers et les modes
    • types de fenêtres et slots
    • fonctions d’action display-buffer
    • paramètres de fenêtre
    • difficulté à exprimer simplement une intention comme « ne touchez pas à ma disposition de fenêtres »
  • Il existe aussi des outils auxiliaires
    • Shackle masque la complexité de display-buffer-alist et fournit une interface Elisp simple
    • Doom Emacs propose des commandes pratiques comme set-popup-rule!
  • Popwin et Popper partent du constat que tous les buffers ne se valent pas
    • Ils distinguent les buffers de travail principaux des buffers popup temporaires
    • Ils affichent documentation, shell, état de tâche, résultats de compilation, résultats de recherche, messages, etc. dans de petites fenêtres auxiliaires faciles à fermer ou à parcourir
    • Popper se concentre sur la possibilité d’afficher ou masquer d’une touche les buffers popup désignés
    • Popwin est une implémentation plus ancienne et plus complète, mais qui embarque aussi sa propre configuration display-buffer
    • Si l’objectif est simplement d’ouvrir et fermer rapidement un shell, shell-pop ou vterm-toggle peuvent suffire

La pièce manquante : la manipulation de l’arbre des fenêtres

  • Emacs représente les fenêtres d’une frame sous forme d’arbre, mais la plupart des commandes utilisateur agissent en fonction de la position spatiale plutôt que de la structure de cet arbre
  • Ce décalage peut entraîner, lors des divisions et suppressions, des comportements différents de ceux attendus, ou imposer des limites aux structures de division possibles
  • Si un package hypothétique comme window-tree existait, il pourrait permettre des manipulations au niveau des nœuds internes
    • diviser, transposer ou refléter seulement une partie de la frame
    • sélectionner plusieurs fenêtres comme une sous-configuration
    • envoyer la sous-configuration sélectionnée vers des onglets ou une frame
    • dupliquer ou enregistrer des sous-configurations
    • protéger une branche précise de l’arbre contre les commandes de la famille display-buffer
  • Il existe déjà des éléments Elisp en ce sens
    • window-tree renvoie l’arbre lui-même
    • frame-root-window renvoie la racine
    • window-parent, window-child, window-*-sibling existent
    • on peut parcourir l’ensemble avec walk-window-tree et walk-windows
  • Les manques sont aussi clairs
    • il n’existe pas de fonction de base pour transformer l’arbre en dehors des opérations générales de split/delete
    • il n’existe pas de notion de sélection d’une fenêtre interne, ce qui oblige à la simuler dans l’interface

La pièce manquante : l’intégration avec un WM tiling

  • Le modèle en arbre des fenêtres d’Emacs ressemble beaucoup à celui des gestionnaires de fenêtres tiling manuels comme i3 ou bspwm
  • Si vous utilisez Emacs dans i3, bspwm ou tmux, vous aurez naturellement envie de naviguer entre les fenêtres internes et externes d’Emacs avec les mêmes raccourcis clavier
  • Parmi les exemples existants, on trouve i3-integration de Pavel Korytov et emacs-wm.el pour qtile
  • Une interface d’intégration plus propre nécessite les éléments suivants
    • Le gestionnaire de fenêtres doit pouvoir identifier la classe de la fenêtre active et fournir par programmation le déplacement et la manipulation des fenêtres
    • Le mode de communication peut passer par des commandes shell, des sockets, un IPC basé sur serveur ou le D-Bus de Linux
    • Côté Emacs, il faut une interface indépendante du mode de communication qui émule les manipulations de type gestionnaire de fenêtres
    • Lors d’un changement de fenêtre au niveau de l’OS, il faut vérifier si la fenêtre active est Emacs et, si nécessaire, laisser Emacs gérer l’opération dans ses frames internes

Conclusion

  • La gestion des fenêtres dans Emacs offre plusieurs niveaux d’options, de other-window à ace-window, Avy, Popper et display-buffer-alist
  • Il n’est pas nécessaire d’utiliser toutes les méthodes : comme il existe de nombreuses alternatives pour résoudre le même problème, on peut en choisir une et ignorer le reste
  • Les outils intégrés de base ont de fortes chances d’être maintenus longtemps, mais l’état des packages tiers peut varier selon qu’ils sont activement développés, délaissés ou devenus orphelins
  • La gestion des fenêtres d’Emacs ressemble moins à un système figé et complexe qu’à une structure ouverte qui fournit des ingrédients et des recettes
  • Même avec peu de configuration, on peut déjà obtenir un menu de base, et avec quelques combinaisons et ajustements en Elisp, créer un flux de travail bien plus personnalisé

1 commentaires

 
GN⁺ 2024-05-13
Avis sur Hacker News
  • Bon article, avec d’excellentes explications et recommandations. Les fenêtres divisées à parts égales ne suffisent pas toujours ; j’ai donc mis la fonction ci-dessous dans init.el et je l’ai liée à C-x 7 pour redimensionner la fenêtre courante et sa fenêtre sœur verticalement en 70 %/30 %
    Je fais pareil à l’horizontale avec un raccourci C-x 8

    (defun partial-size-window ()
    "Set the two split windows to 70% and 30% vertically."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-height))) (window-height))))
    (if (> size 0)
    (enlarge-window size))))

    (defun partial-size-window-h ()
    "Set the two split windows to 70% and 30% horizontally."
    (interactive)
    (let ((size (- (truncate (* .70 (frame-width))) (window-width))))
    (if (> size 0)
    (enlarge-window-horizontally size))))

    • golden-ratio peut aussi servir à ce genre d’usage
  • Belle exploration. Je suis sur mobile pour l’instant, donc je ne peux pas essayer tout de suite, mais j’ai hâte de tester ace-window, ace-window-display-mode et frames-only-mode
    Pour être honnête, même après environ 40 ans d’Emacs, je me suis surtout contenté de next-window, de créer une nouvelle fenêtre en dessous ou à côté, et de m’appuyer sur tmux quand je travaille sur des serveurs distants

    • Pareil pour moi. Pendant 30 ans, je me suis presque limité à C-x 1/2/3 et C-x o
      Cela dit, c’est en fait assez puissant et suffisant pour mes besoins ; j’aimerais que plusieurs gestionnaires de fenêtres en pavage se limitent justement à ce niveau
    • Pareil pour moi. C-x o est un peu fastidieux, donc j’ai la configuration ci-dessous, mais je ne ressens pas vraiment le besoin de ces paquets supplémentaires
      (global-set-key (kbd "M-o") #'other-window)
      Cela dit, c’est agréable d’avoir un article de référence aussi approfondi, et les articles de Karthik sont toujours instructifs et intéressants
  • Pour compléter la note de Karthink sur windmove-mode, on peut configurer windmove-default-keybindings pour se déplacer entre les fenêtres avec Ctrl-<flèches>
    (windmove-default-keybindings 'control)
    Je l’ai aussi dans ma configuration, et je l’ai inclus dans un kit de démarrage minimaliste : c’est vraiment un game changer
    https://codeberg.org/ashton314/emacs-bedrock

    • Je viens de vérifier mon .emacs et j’utilisais exactement la même chose. Je préfère ça à C-x O, car cela demande une touche de moins et c’est plus flexible
  • J’ai configuré Emacs pour qu’il ne divise pas les frames en plusieurs fenêtres. C’est un peu comme un navigateur web qui ne découpe pas une fenêtre de navigateur en plusieurs viewports
    Mon Emacs ne crée pas non plus de deuxième frame. La manière de l’implémenter a changé d’année en année, à mesure que les anciennes méthodes cessaient de fonctionner
    Avec la méthode actuelle, dans certains cas, par exemple quand Emacs affiche le tampon *Completions*, la frame est divisée ; mais si je me souviens bien, je n’ai jamais eu à appeler delete-window manuellement pour supprimer la deuxième fenêtre, elle disparaissait toujours d’elle-même

    • Les navigateurs web peuvent effectivement diviser la fenêtre de cette manière, du moins ceux comme Vivaldi qui permettent d’afficher plusieurs pages en même temps
    • Je me demande si empêcher une frame d’être divisée en plusieurs fenêtres visait à résoudre un problème particulier
      J’utilise assez souvent des frames à plusieurs fenêtres. Sur les versions récentes de macOS et d’Emacs, il m’arrive qu’une frame à plusieurs fenêtres semble figée et ne réponde plus au clavier ou au trackpad, même après plusieurs Ctrl-G
      En revanche, créer une nouvelle frame avec C-x 5 2 fonctionne, et je pouvais revenir à la frame bloquée puis la fermer avec C-x 5 0
  • L’article est très approfondi, et j’apprécie vraiment que l’auteur ait pris le temps de réaliser de bons schémas

  • Bon article, et je voudrais partager un excellent paquet à utiliser avec. Pour moi, zygospore est devenu indispensable
    « zygospore permet d’annuler C-x 1 (delete-other-window) en appuyant de nouveau sur C-x 1 »
    https://github.com/LouisKottmann/zygospore.el

    • Pour refaire ou annuler toutes les modifications de configuration des fenêtres, winner mode mérite le coup d’œil
      https://www.emacswiki.org/emacs/WinnerMode
    • Idéalement, ça devrait sans doute être undo
      Ce serait étrange, mais C-u C-x 1 semblerait cohérent
  • Si l’auteur voit ceci, je voudrais lui dire que la petite mention de l’éditeur Acme m’a fait plaisir

  • Quand j’appelle hledger-balance-sheet, j’aimerais qu’il ne remplace pas le .hledger.journal existant, mais qu’il s’ouvre à droite avec une largeur de 30 %
    À gauche, je voudrais que .hledger.journal reste ouvert tel quel et demeure sélectionné