Passer de lsp-mode à Eglot dans GNU Emacs
(utcc.utoronto.ca)- Retour d’expérience concret sur le remplacement complet d’un environnement LSP basé sur lsp-mode qui fonctionnait bien par Eglot, la solution LSP intégrée à GNU Emacs
- Par rapport à lsp-mode, Eglot offre une interface minimaliste et discrète, et s’intègre avec des paquets externes comme Corfu, Consult et Flycheck via les API standard d’Emacs Lisp
- L’essentiel du travail de transition a porté non pas sur la configuration d’Eglot lui-même, mais sur l’exploration, le réglage et les tâtonnements autour des paquets auxiliaires
- Selon le serveur LSP, comme pylsp ou gopls, la méthode de configuration du workspace diffère, et pour une configuration au niveau du projet, il faut utiliser
.dir-locals.el - Puisqu’Eglot est intégré à GNU Emacs, il peut valoir la peine, à long terme, d’envisager la transition si vous utilisez Emacs
Motivation du changement et impression générale
- Sans raison particulièrement forte, l’auteur a commencé à tester Eglot après être passé à Corfu, puis a poursuivi la migration
- lsp-mode + lsp-ui proposent une interface chargée (busy), avec beaucoup d’informations affichées en même temps ; le passage visait une expérience LSP plus calme
- Eglot est plus minimaliste que lsp-mode, mais il faut compléter les fonctionnalités avec des paquets supplémentaires pour obtenir une expérience complète
- Au final, le résultat est satisfaisant, et dans les modes Go et Python, des fonctions comme l’autocomplétion sur préfixe commun marchent mieux
- Il aurait aussi été possible d’ajuster davantage la configuration de lsp-ui, mais le passage à Eglot a résolu tous les problèmes d’un coup
Intégration des paquets auxiliaires
- Corfu fonctionne pour l’autocomplétion sans configuration supplémentaire, avec la configuration existante
- Pour obtenir un aperçu de style lsp-ui dans les références croisées, il faut connecter le paquet consult et définir
xref-show-xrefs-functionsurconsult-xref - Après hésitation entre Flycheck et Flymake, le choix s’est porté sur Flycheck
- Flymake s’intègre mieux à Eglot, mais Flycheck reste globalement préféré
- Comme Eglot active automatiquement flymake-mode, il faut ajouter
flymakeàeglot-stay-out-ofpour le désactiver - Le mode global de flycheck-eglot ne fonctionnant pas de manière stable, une configuration directe via hook a été utilisée
Configuration des raccourcis clavier
- Eglot ne fournit pas de raccourcis clavier par défaut, il faut donc les définir soi-même
- Exemples de raccourcis actuellement utilisés :
C-c r→eglot-rename,C-c o→eglot-code-action-organize-importsC-c h→eldoc,C-c a→eglot-code-actions,C-c q→eglot-code-action-quickfixC-M-<mouse-2>→eglot-code-actions-at-mouse(un raccourci souris pour contourner les limites d’intégration de flycheck-eglot)
eglot-formatn’est volontairement pas associé à un raccourci — en Go, gofmt de go-mode est déjà utilisé- En définissant
eglot-extend-to-xrefsurt, on peut, après avoir sauté vers un élément externe, chercher avec M-? d’autres usages dans le projet
Démarrage automatique du serveur LSP
- La documentation officielle d’Eglot recommande un démarrage manuel, mais une configuration a été mise en place pour démarrer automatiquement uniquement pour les fichiers locaux
- La fonction
eglot-ensure-local-onlyest définie pour vérifier si le fichier est distant avecfile-remote-p, puis appelereglot-ensure - Limite de
eglot-ensure: lorsqu’il existe plusieurs serveurs LSP pour un même langage (par exemple pylsp et ruff pour Python), seul le serveur par défaut est choisi automatiquement ; pour en changer, il faut arrêter le serveur courant puis lancereglotmanuellement - Pour exécuter plusieurs serveurs LSP simultanément, on peut utiliser un multiplexeur comme rassumfrassum
Accessibilité des Code Actions
- Les code actions fournies par les serveurs LSP sont nombreuses, mais il est difficile d’y accéder commodément dans Eglot (comme dans lsp-mode)
- Les serveurs LSP ne fournissent les code actions qu’à la demande, et elles dépendent d’une position précise
- Eglot ne propose pas de filtrage dans les longues listes de code actions renvoyées par le serveur, ce qui rend ces listes encombrées aussi bien en Go qu’en Python
Configuration du workspace dans pylsp
- Avec pylsp (serveur Python LSP), pour désactiver en permanence les linters basés sur le style dans les diagnostics, il faut utiliser eglot-workspace-configuration
- lsp-mode propose des contrôles pratiques pour désactiver des outils de diagnostic individuels (comme mccabe), mais avec Eglot, il faut écrire soi-même la workspace configuration au format JSON
- Exemple : désactiver mccabe, pylint, mypy, pycodestyle, etc. avec
:enabled :json-false - Les clés liées à mypy sont utilisées sous deux noms différents,
pylsp_mypyetmypy, ce qui vient de détails d’implémentation internes à pylsp - Il faut impérativement utiliser
setq-default; avecsetq, cela ne fonctionne pas
Configuration par projet et .dir-locals.el
- Eglot ne propose pas de méthode pratique pour définir temporairement des paramètres de serveur LSP propres à un projet
- Lorsqu’une configuration spécifique est nécessaire, le plus simple est d’écrire correctement les réglages dans le fichier
.dir-locals.el - Dans gopls (Go) et pylsp (Python), la structure de configuration est complètement différente, et il faut donc apprendre chaque serveur LSP séparément
- Pour modifier la configuration à l’exécution, il faut écrire une fonction dédiée qui définit une nouvelle classe via
dir-locals-set-class-variables, puis appelledir-locals-set-directory-classeteglot-signal-didChangeConfiguration - Eglot exécute un seul serveur LSP pour l’ensemble d’un projet (arborescence de répertoires), donc une configuration LSP au niveau fichier ou buffer est impossible ; elle doit impérativement être appliquée au niveau du projet
- Si
eglot-workspace-configurationest défini par un moyen générique, il devient une variable locale au buffer, ce qui le rend en pratique inutile
Retour d’expérience : Flymake vs Flycheck
- Flymake s’intègre mieux à Eglot et affiche directement dans les notes de diagnostic des propositions de correction fondées sur le serveur LSP (quickfix code action) dans le menu contextuel du bouton 2
- Flycheck se limite au marquage des erreurs, avec la contrainte de devoir déclencher séparément les code actions LSP
- Après être d’abord passé à Flymake, l’auteur a conservé les deux configurations, car Flycheck reste meilleur sur certains points
- L’auteur de flycheck-eglot a proposé une solution de contournement à ce problème, ce qui a permis de revenir à Flycheck
- Flycheck dispose d’une collection de checkers plus vaste que Flymake, et il est plus facile de passer de l’un à l’autre
- L’option de diagnostic affiché en fin de ligne de Flymake laisse à désirer
- flycheck-inline n’affiche que les avertissements à la position actuelle et ne montre pas tous les avertissements pendant le défilement
- Sideline + sideline-flycheck ont la même limite, mais offrent une meilleure expérience UI
2 commentaires
https://web.archive.org/web/20260513001754/…
Commentaires de Lobste.rs
Selon le langage, conseiller de lancer Eglot automatiquement peut être dangereux au plus haut point. Les serveurs LSP de nombreux langages ne peuvent pas être utilisés en toute sécurité avec du code non fiable, et le simple fait d’ouvrir les fichiers d’un projet Rust ou Elixir contrôlé par un attaquant peut compromettre la machine
À moins qu’il s’agisse d’un langage dont le serveur LSP est connu pour être sûr, il faut éviter l’activation automatique du LSP. Référence : https://rust-analyzer.github.io/book/security.html
git statuspeut constituer une surface d’attaque : https://github.com/justinsteven/advisories/…La différence est que, dans ce cas, l’exploit doit être présent dans le dépôt lui-même, alors qu’avec le LSP, le problème peut aussi venir des dépendances. Cela dit, si on s’habitue à activer le LSP par réflexe, il semble difficile d’éviter de devenir moins sensible aux avertissements
rust-analyzerde 4 Go pendant plusieurs minutes et créer un répertoiretarget/debug/de plus de 1 Gocargo build, c’est déjà plié. Bien sûr, il y a une grande différence entre le chargement automatique du LSP et une commande lancée explicitement par l’utilisateur, mais en pratique l’écart est parfois plus faible qu’on ne l’imaginelsp-mode: demander avant l’activation et ajouter le projet à une liste d’autorisation. S’il existe déjà un hook qui « exécute automatiquement », il suffit d’une dizaine de lignes avecread-from-minibufferpour demander d’abord « Faites-vous confiance à ce dossier ? », et en prenant un répertoire de référence avec quelque chose commeprojectile, on obtient l’essentiel des bénéfices en matière de sécuritéDans ma configuration, j’utilise la liste d’autorisation de
lsp-mode, mais je l’efface à chaque session, de sorte qu’il faut redonner son accord projet par projet à chaque redémarrage d’Emacs. Au départ, je crois que j’ai fait ça pour des raisons de performance, carlsp-modelançait parfois plusieurs processus avant même d’ouvrir un projet donné. Le risque de sécurité est réel, mais mettre en place un workflow correct n’est pas si difficileCe qui m’agace le plus dans Eglot, c’est qu’il n’expose pas la plupart de ses commandes comme fonctions et les définit plutôt sur des interfaces Emacs comme
xref. Quand on a deux backendsxref, par exempleCIDERetclojure-lspen Clojure, on a tendance à préférerCIDER, qui connaît l’état d’exécution réel du code chargéL’analyse statique de
clojure-lsppeut notamment être désynchronisée, surtout dans un workflow REPL distant. Aveclsp-mode, on peut appeler directement des fonctionnalités comme aller à la définition tout en continuant à utiliserxref, mais avec Eglot, exclure seulement un backendxrefparticulier est assez pénible. D’autres commandes présentes danslsp-modemanquent aussi dans Eglot, alors qu’en réalité ce sont des fonctionnalités qui pourraient être fournies via des points d’intégration Emacs similaires àxrefJ’ai essayé
lsp-modeune fois, mais je l’ai supprimé immédiatement à cause du trop grand nombre de pop-ups et de notifications confuses. Eglot offre une expérience LSP bien plus discrèteOn peut le laisser activé et utiliser les fonctionnalités quand on est prêt. Il est intéressant de voir ~cks adopter l’approche inverse tout en mentionnant divers conseils et alternatives
lsp-modeavec beaucoup de fonctionnalités désactivées, ce qui donne une interface assez discrète. J’ai envisagé de passer à Eglot, mais il ne semblait pas offrir les intégrations que je voulais, donc je n’ai pas poussé plus loin à l’époqueCe que je cherche vraiment, c’est un serveur LSP capable de gérer des dépôts très volumineux. C’est souvent là que j’atteins la limite, et je me demande parfois s’il ne faudrait pas créer quelque chose qui fasse l’essentiel de l’indexation du code source en une fois pour le réutiliser dans diverses opérations de type LSP, mais j’ai peur de vouloir encore faire bouillir l’océan
Eglot et
lsp-modesont les clients LSP les plus connus pour Emacs, mais il existe aussi des alternatives comme lspce et lsp-bridgeJ’utilise Eglot avec satisfaction depuis plusieurs années, mais il présente une limite de conception qui pourrait devenir plus problématique à l’avenir. Il part du principe qu’il n’y a qu’un client par buffer ; c’était raisonnable au moment de sa création, mais aujourd’hui il devient de plus en plus courant de vouloir faire tourner plusieurs serveurs LSP dans un même buffer. La [recommandation] actuelle est d’utiliser un programme séparé comme multiplexeur LSP
Je suis passé de
lsp-modeà Eglot pour Python il y a 4 jours, et j’en suis satisfaitJ’ai publié ici une version minimale de ma configuration actuelle : https://discuss.afpy.org/t/configuration-emacs-minimale-en-2026/3001
J’ai tout de même quelques frustrations côté complétion. Par exemple, quand j’appuie sur
foo<tab><tab>,basedpyrightauto-importe parfois quelque chose d’étrange alors qu’un symbole pertinent existe déjà dans la portée actuelle, et je n’ai pas encore trouvé comment ne compléter que jusqu’à la plus longue sous-chaîne commune. À part ça, c’est plutôt bienJ’envie les gens qui arrivent à faire d’Emacs un IDE moderne. J’utilise les raccourcis Emacs, mais même en y consacrant 6 à 8 heures, je n’arrive pas à transformer Emacs en IDE
J’avais déjà renoncé autrefois en essayant de l’adapter à FB Flow, que j’utilisais à la place de TypeScript dans des environnements de développement Linux et FreeBSD, et le week-end dernier j’ai encore abandonné en tentant de monter sous Windows un environnement Python complet avec tree-sitter. Il y a trop de choses à configurer, et il faut aussi récupérer séparément trop de DLL, comme les parseurs tree-sitter, si bien que l’effort requis pour obtenir quelque chose d’équivalent à un vrai IDE est excessif. Je n’ai plus envie d’y consacrer du temps, mais j’aime toujours le fait qu’en tapant
emacs -nwdans n’importe quel terminal, je retrouve un environnement d’édition familierfido-vertical-mode,which-key-mode,global-completion-preview-mode,yasnippet,eglot-ensureetbasedpyrightsuffit largement pour démarrerSi
basedpyrightest présent dans le PATH, on obtient une vraie complétion et une coloration syntaxique correcte même sans grammaire tree-sitter. C’est une version réduite au minimum de ma configuration complète, et celle-ci est disponible dans my full configdoom emacsvaut le coup d’œil. La configuration est très simple et, même par défaut, la plupart des choses fonctionnent bien. Sievil-modene vous convient pas, vous pouvez aussi revenir aux raccourcis Emacs