1 points par GN⁺ 13 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Emacs 31 n’est pas encore officiellement publié, mais des changements déjà perceptibles s’accumulent dans la branche emacs-31 et dans master, avec une évolution générale vers des réglages pris en charge par le cœur d’Emacs sans paquet externe
  • L’arrivée du basculement automatique vers Tree-sitter et de l’installation des grammaires réduit la charge liée à la gestion manuelle des major modes et des sources de grammaire
  • markdown-ts-mode, le rendu de documentation d’Eglot, eldoc-help-at-pt, la completion eager et xref-edit-mode renforcent les flux d’édition, de navigation et de consultation de documentation autour de fonctions intégrées
  • De petites options comme la side window de Speedbar, le masquage automatique dans VC, les conditions de logs d’ERC, kill-region-dwim, ielm-history-file-name ou native-comp-async-on-battery-power réduisent les frictions répétitives
  • Les noms de fonctionnalités et les valeurs par défaut d’Emacs 31 peuvent encore changer, et markdown-ts-mode ainsi que le rendu de documentation d’Eglot qui l’utilise sont indiqués comme fonctionnalités expérimentales et doivent être activés explicitement

Le cadre de cette préversion d’Emacs 31

  • Emacs 31 n’est pas encore publié, et l’environnement de référence consiste à compiler et utiliser la branche emacs-31 et master à la mi-2026
  • Les éléments présentés sont des changements réellement intégrés dans une configuration quotidienne, et la plupart sont déjà entrés dans le cœur d’Emacs ou sont très proches de l’être
  • Les noms de fonctionnalités et les valeurs par défaut peuvent encore changer jusqu’à la publication finale
  • Des exemples de configuration sont visibles dans le init.el de Emacs Solo, avec le commentaire ; EMACS-31

Moins de configuration pour Tree-sitter

  • Dans Emacs 31, deux options simplifient le basculement vers les modes fondés sur Tree-sitter et le flux d’installation des grammaires
    • treesit-enabled-modes t
    • treesit-auto-install-grammar t
  • Si treesit-enabled-modes vaut t, les major modes qui ont une variante Tree-sitter basculent vers cette variante
  • treesit-auto-install-grammar ne se contente plus d’émettre une erreur lorsqu’une grammaire manque : Emacs propose alors de la récupérer et de la compiler
  • Comme les sources de grammaire pour des langages comme TypeScript, TSX, Rust, TOML, YAML ou Dockerfile sont désormais incluses dans les modes, on peut réduire les réglages où l’on ajoutait soi-même URL et chemins dans treesit-language-source-alist
  • Il faut faire attention si l’on utilise un répertoire Emacs partagé entre plusieurs architectures
    • les grammaires installées automatiquement ne sont pas séparées par architecture
    • un .so pour x86_64 et un .so pour arm64 peuvent se retrouver sous le même nom, si bien qu’un binaire compilé sur une machine peut ne pas être chargeable sur une autre

markdown-ts-mode intégré

  • Emacs 31 inclut un markdown-ts-mode expérimental
  • Ce mode est né d’une proposition envoyée à emacs-devel début 2025, puis Stéphane Marks a rejoint le travail comme coauteur pour poursuivre les améliorations
  • Il traite Markdown non pas comme un simple sujet de coloration syntaxique, mais comme un environnement d’édition agréable à écrire et à lire
    • Il propose des déplacements entre titres, du repliage et des mouvements entre éléments structurels familiers aux utilisateurs d’Org
    • Les fenced code blocks ne sont pas affichés comme un texte monospacé plat : ils reçoivent le font-locking du major mode réel du langage concerné
    • Les blocs Emacs Lisp et d’autres modes intégrés peuvent aussi bénéficier d’une vraie coloration syntaxique
    • Les commandes d’édition des blocs de code fonctionnent en grande partie déjà, même si la completion à l’intérieur des blocs reste encore un peu brute
    • Les liens d’image sont rendus inline dans le buffer
  • Il n’est pas encore relié à auto-mode-alist, donc il ne prend pas automatiquement en charge les fichiers .md
    • On peut charger la bibliothèque avec M-x load-library RET markdown-ts-mode, puis l’activer dans le buffer
    • Il est aussi possible de l’ajouter soi-même à auto-mode-alist
  • Les retours peuvent être envoyés à la bug list via M-x report-emacs-bug
  • D’autres captures d’écran sont disponibles dans la démo markdown-ts-mode-lab

Améliorations d’Eglot, Eldoc et de la completion

  • Dans Emacs 31, Eglot peut rendre la documentation LSP avec markdown-ts-view-mode
    • eglot-documentation-renderer 'markdown-ts-view-mode
    • il devient possible de consulter des hover docs formatées sans paquet externe
    • cette fonction dépend de markdown-ts-mode et reste donc elle aussi expérimentale
  • eglot-code-action-indications permet de désactiver les nouveaux indices inline de code actions
    • avec certains language servers, ces indices peuvent sembler trop envahissants
  • eglot-events-buffer-size est en train d’être remplacé par eglot-events-buffer-config
  • eldoc-help-at-pt t affiche l’aide pour l’élément sous le curseur sans appel séparé
    • utilisé avec eldoc-echo-area-prefer-doc-buffer, cela apporte davantage de guidage quand on explore du code inconnu
  • De nouveaux réglages de completion rendent l’interface plus réactive pendant la saisie
    • completion-eager-update t
    • completion-eager-display 'auto
    • minibuffer-visible-completions 'up-down
  • completion-eager-update et completion-eager-display mettent à jour l’interface de completion en fonction de la saisie, même avant que l’utilisateur ne la demande explicitement
  • Si minibuffer-visible-completions est réglé sur 'up-down, on peut parcourir les candidats visibles avec les touches fléchées
  • icomplete inclut un correctif de bug#75784 qui ajoute le comportement vertical in-buffer et un indicateur de préfixe
    • icomplete-vertical-in-buffer-adjust-list
    • icomplete-vertical-render-prefix-indicator

Disposition des fenêtres et Speedbar

  • Emacs 31 ajoute des commandes qui permettent de modifier la disposition des fenêtres sans avoir à tout redécouper et refermer manuellement
    • window-layout-transpose
    • window-layout-rotate-clockwise
    • window-layout-flip-leftright
    • window-layout-flip-topdown
  • transpose inverse un agencement horizontal/vertical, rotate fait pivoter l’ensemble de la disposition, et les commandes flip la reflètent à gauche/droite ou haut/bas
  • C’est pratique quand on veut simplement changer la position des fenêtres d’édition dans une disposition à trois fenêtres tout en conservant les buffers
  • Dans Emacs 31, Speedbar peut être placé dans une side window au lieu d’une frame séparée
    • speedbar-window-default-width
    • speedbar-window-max-width
    • speedbar-window
  • speedbar-window ancre Speedbar sur le côté, comme un arbre de fichiers plus moderne
  • Dans un environnement en tiling ou sur un portable à écran unique, cette approche en side window s’adapte mieux que l’ancienne frame flottante

VC et xref éditable

  • VC reçoit des réglages qui allègent le flux quotidien de gestion de versions
    • vc-auto-revert-mode t
    • vc-allow-rewriting-published-history t
    • vc-dir-auto-hide-up-to-date 'revert
  • vc-dir-auto-hide-up-to-date masque automatiquement les fichiers à jour quand on rafraîchit un buffer vc-dir
    • on peut ainsi supprimer les bricolages de raccourcis qui appelaient vc-dir-hide-up-to-date après vc-dir-refresh
  • vc-allow-rewriting-published-history convient aux flux qui réécrivent volontairement un historique déjà poussé, comme avec Jujutsu ou un force-push sur une feature branch
  • Emacs 31 introduit un buffer xref éditable
    • jusque-là, le buffer xref ne proposait que r, via xref-query-replace-in-results, et se limitait aux remplacements basés sur des expressions régulières
    • contrairement à wdired-mode pour Dired ou grep-edit-mode pour les buffers grep, xref n’avait pas de flux où l’on modifie directement le buffer de résultats
  • La première proposition consistait à exporter les résultats xref avec xref-export-to-grep dans un buffer en grep-mode au format file:line:content, puis à l’éditer
  • Dmitry Gutov, mainteneur de xref, a proposé une édition inline dans le buffer xref plutôt qu’une interface détournée via un buffer grep, puis xref-edit-mode a été écrit et intégré
  • xref-edit-mode évite les changements de buffer supplémentaires et fonctionne plus rapidement même avec de gros buffers xref
  • Le flux d’utilisation consiste à lancer une recherche avec C-x p g, puis à démarrer le mode édition avec e dans le buffer *xref*, avant de valider avec C-c C-c après modification
  • La discussion associée est publique dans bug#80616

ERC et petites améliorations de qualité de vie

  • ERC permet avec erc-log-insert-log-on-open 'erc-log-new-target-buffer-p de n’insérer les anciens logs qu’à l’ouverture d’un nouveau target buffer
  • Dans Emacs 31, le module scrolltobottom d’ERC ne dépend plus de erc-fill-wrap, ce qui permet de supprimer les réglages conditionnels destinés aux versions précédentes
  • De petites valeurs de configuration contribuent elles aussi à améliorer l’usage quotidien
    • delete-pair-push-mark t : pousse la mark après delete-pair, ce qui permet de sélectionner l’intérieur avec C-x C-x
    • ibuffer-human-readable-size t : affiche des tailles en KB/MB au lieu des octets bruts
    • ielm-history-file-name : conserve l’historique de saisie d’IELM après redémarrage
    • kill-region-dwim 'emacs-word : en l’absence de region active, C-w supprime le mot suivant au lieu d’émettre une erreur
    • native-comp-async-on-battery-power nil : arrête la compilation native en arrière-plan sur batterie
    • view-lossage-auto-refresh t : C-h l met à jour les dernières frappes en temps réel
    • display-fill-column-indicator-warning nil
    • dired-hide-details-hide-absolute-location t : masque le chemin absolu du répertoire dans dired-hide-details-mode
    • world-clock-sort-order "%FT%T" : ajuste l’ordre de tri de l’horloge mondiale
    • zone-all-frames t
    • zone-all-windows-in-frame t
    • uniquify-after-kill-buffer-flag t : le nom a changé par rapport à l’ancienne variante en -p
  • kill-region-dwim évite le message d’erreur « the mark is not active » sur C-w
  • view-lossage-auto-refresh est utile pour montrer les frappes en direct pendant un partage d’écran ou une formation
  • native-comp-async-on-battery-power nil réduit les cas où le ventilateur se met à tourner à cause de la compilation en arrière-plan pendant les déplacements sans alimentation secteur
  • tty-tip-mode apporte des tooltips même dans Emacs lancé avec -nw

term, thèmes Modus et pourquoi utiliser master

  • Emacs 31 corrige des problèmes dans term et ansi-term où des lignes étaient avalées ou l’affichage se corrompait
    • des programmes comme htop, nethack ou d’autres applications basées sur curses qui utilisent l’adressage du curseur et le redraw plein écran se redessinent correctement dans le terminal Emacs
    • cela enlève une raison de plus d’ouvrir un émulateur de terminal externe
  • Emacs inclut les thèmes Modus 5 de Protesilaos
    • modus-operandi-deuteranopia : thème à fond blanc optimisé pour la deutéranopie
    • modus-operandi : thème à fond blanc à haute lisibilité
    • modus-operandi-tinted : thème à fond ocre clair à haute lisibilité
    • modus-operandi-tritanopia : thème à fond blanc optimisé pour la tritanopie
    • modus-vivendi-deuteranopia : thème à fond noir optimisé pour la deutéranopie
    • modus-vivendi : thème à fond noir à haute lisibilité
    • modus-vivendi-tinted : thème à fond ciel nocturne à haute lisibilité
    • modus-vivendi-tritanopia : thème à fond noir optimisé pour la tritanopie
  • Si l’on utilise au quotidien une version non publiée d’Emacs, c’est pour voir directement ce qui entre dans le cœur et constater, à chaque version, la diminution du code de glue maison nécessaire
  • On peut lire en complément l’article jumeau consacré à des fonctions déjà intégrées : Even More Batteries Included with Emacs

1 commentaires

 
Avis sur Lobste.rs
  • Le changement autour de tree-sitter me réjouit vraiment. J’ai toujours trouvé la configuration assez maladroite
    Je suis aussi curieux de voir eager complete. icomplete et fido-mode s’approchent déjà pas mal de ce que je veux, mais ce n’est pas encore aussi agréable à utiliser qu’un paquet tiers comme corfu

    • J’espère qu’un jour on pourra obtenir une expérience proche de vertico et consorts uniquement avec les fonctionnalités intégrées, et même activée par défaut
      Avec quelques ajustements et en activant seulement les fonctions intégrées, l’utilisabilité change déjà beaucoup, et c’est ainsi que sont configurés bedrock ou emacs-solo
    • J’utilise Emacs 32 au quotidien, et je ne dirais pas que treesit fonctionne tout simplement
      À chaque démarrage d’Emacs, j’ai systématiquement un gros message à propos d’une dylib manquante
  • Dans l’exemple, la syntaxe de (treesit-auto-install-grammar t) et (treesit-enabled-modes t) ressemble à des appels de fonction, mais ce sont en réalité des options à configurer
    Il y a aussi de petits changements sympa dans la prochaine version : minibuffer-nonselected-mode est activé par défaut, ce qui permet de mieux voir s’il reste du travail inachevé dans le minibuffer, et diff-mode avec diff-delete-other-hunks est très utile avec le comportement VC des buffers diff introduit dans Emacs 29
    with-work-buffer ressemble à with-temp-buffer, mais réutilise un pool de buffers. Je l’ai découvert par hasard en utilisant dans ma config la même convention de nom de buffer, *work*
    Emacs 31 inclut lua-mode, donc il n’y a plus besoin de l’installer séparément
    J’ai aussi dû faire quelques ajustements pour retrouver exactement le comportement que je voulais : xterm-mouse-mode est activé par défaut, donc je l’ai désactivé explicitement, et la face mode-line change pour s’adapter aux thèmes sombres, mais comme j’étais habitué aux anciennes couleurs par défaut, je suis revenu en arrière
    Emacs 31 affiche un avertissement si un fichier source n’a pas de cookie lexical-binding. Si ça gêne, on peut le désactiver, le corriger facilement avec la commande elisp-enable-lexical-binding, et il est aussi possible de faire de lexical-binding la valeur par défaut globale
    Sauf apparition de nouveaux bugs, cela ressemble comme toujours à une version solide

    • Cet exemple semble probablement copié depuis la liste :custom de use-package
      C’est pour ça que je reste partagé sur :custom. C’est plus pénible pour expérimenter des valeurs ou les partager
    • with-work-buffer, c’est pour des raisons de performance ? La documentation n’explique pas pourquoi l’utiliser à la place de with-temp-buffer, elle dit seulement qu’il faut être plus prudent
    • Je me demande comment désactiver cet avertissement. Dans l’idéal, j’aimerais qu’il n’avertisse pas pour les fichiers dans elpa, mais seulement pour mes propres fichiers
      En plus, sur les 68 avertissements de mon Emacs, 64 viennent de fichiers générés -autoloads.el. Ça semble devoir être corrigé côté outils de génération de elpa/melpa
  • J’attendais enfin des xref éditables, et ça a l’air de vraiment me simplifier la vie
    Il y a énormément d’excellents changements qui touchent de façon étonnamment large ce que j’utilise tous les jours

  • Nvim a remplacé par défaut les expressions régulières vim par treesitter, et ça a cassé mon environnement d’écriture
    treesitter demandait un peu de configuration pour parser les commentaires HTML dans Markdown, et même après avoir assemblé les pièces, ça ne marchait pas
    Au final, j’ai réglé le problème en désactivant treesitter
    Je suis très conservateur sur l’infrastructure de base comme l’éditeur. Les changements d’éditeur cassent presque toujours quelque chose qui fonctionnait sans problème depuis des années

    • Heureusement, Emacs ne bascule pas ses valeurs par défaut vers treesitter ; cela reste entièrement optionnel