C’est la suite de mon sujet de 2021 : Emacs : aujourd'hui j'essaye lsp-mode.
En 2026 je migre de jedi qui n’est plus maintenu à zuban. J’en profite pour migrer de lsp-mode à eglot qui est devenu natif.
Déjà, à quoi ça ressemble :
Le paquet Debian que j’utilise est emacs-pgtk.
Ensuite, la config « minimale » (72 lignes) :
(require 'use-package)
(require 'package)
(package-initialize)
(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")))
(when (not package-archive-contents)
(package-refresh-contents))
(use-package yasnippet
:ensure t
:config
(yas-global-mode 1))
(use-package yasnippet-snippets
:ensure t)
(use-package company
:ensure t
:hook
(python-mode . company-mode))
(use-package envrc
:ensure t
:init (envrc-global-mode))
(use-package eglot
:hook (python-mode . eglot-ensure)
:config
(add-to-list 'eglot-stay-out-of 'flymake)
(add-to-list 'eglot-server-programs '((python-mode) . ("zuban" "server"))))
(use-package python
:custom
(python-indent-guess-indent-offset nil))
(use-package flycheck
:ensure t
:config
(global-flycheck-mode t))
(use-package blacken
:ensure t
:commands (blacken-mode)
:hook (python-mode . blacken-mode)
:config
(setq blacken-only-if-project-is-blackened t))
(use-package python-isort
:ensure t
:hook ((python-mode) . python-isort-on-save-mode)
:config
(setq python-isort-arguments '("--stdout" "--atomic" "-" "--profile=black")))
(use-package whitespace
:diminish (whitespace-mode global-whitespace-mode whitespace-newline-mode)
:hook ((python-mode) . whitespace-mode)
:config
(setq show-trailing-whitespace t)
(setq whitespace-line-column 88)
(setq whitespace-style '(face empty tabs lines-tail trailing)))
(use-package spacemacs-theme
:ensure t
:defer t
:init
(load-theme 'spacemacs-light t))
(global-font-lock-mode t)
(column-number-mode t)
(show-paren-mode t)
Le fichier se place dans ~/.emacs.d/init.el. La première fois qu’emacs démarre il télécharge tous les paquets décrits dans la config, donc le premier démarrage est long, c’est normal.
Maintenant pour qu’eglot puisse trouver zuban, pour que flycheck puisse trouver pylint, et pour que blacken-mode puisse trouver black le mieux c’est … un venv !
Et pour que le venv du projet soit chargé automatiquement par emacs j’utilise direnv, ça fait double usage : mes venv sont aussi activés automatiquement dans le shell !
Pour configurer direnv il faut un fichier .envrc à la racine du projet qui contient :
VIRTUAL_ENV=.venv
layout python3
Si c’est votre première utilisation de direnv il faut rajouter eval "$(direnv hook bash)" dans ~/.bashrc.
Il vous fera executer direnv allow pour l’autoriser à bosser, et hop, le venv est crée tout seul, et activé automatiquement par bash et emacs.
Faites-vous un alias ou une commande nommé venv pour gagner du temps sur la création de ce .envrc.
Il faut installer deux-trois trucs dans le venv :
pip install --upgrade zuban black mypy pylint
puis démarrer emacs :
emacs test.py
Pour ceux qui n’ont jamais lancé emacs avant, tapez Ctrl-h puis t, ça vous ouvrira le tuto interactif.
Ohhh, et j’ai configuré blacken-mode pour ne passer black à la sauvegarde que s’il trouve [tool.black] dans pyproject.toml, ça m’évite d’avoir emacs qui réecrit des fichiers dans des projets qui n’utilisent pas black, c’est la ligne blacken-only-if-project-is-blackened dans la config.
Quelques raccourcis importants :
M-.: c’est pour aller a la définition de quelque chose.M-x eglot-renamepour renommer une variable (et toutes ses occurrences).C-c ! npour sauter a la prochaine erreur.
Ma configuration complète est ici : https://git.afpy.org/mdk/dotfiles/src/branch/main/.emacs.d/init.el, elle est plus longue : j’enlève les menus, le message d’accueil, la décoration de la fenêtre, j’ajoute du confort, et j’ai de la configuration C, rust, org-mode, je configure emacs en mode serveur (et j’utilise emacsclient), etc…
