Configuration personnelle de Neovim (Lua + lazy.nvim), orientée Python et Lua : LSP via Mason, formatage automatique à la sauvegarde, complétion nvim-cmp, Telescope, Treesitter, thème Catppuccin.
.
├── init.lua # Bootstrap de lazy.nvim + chargement des modules
└── lua/
├── vim-options.lua # Options générales (leader = espace, undo persistant, numérotation relative)
├── plugins.lua # Spec vide (les plugins sont dans lua/plugins/)
└── plugins/ # Un fichier = un plugin (chargés automatiquement par lazy.nvim)
├── autopairs.lua # nvim-autopairs : fermeture auto des paires
├── catppuccin.lua # Thème
├── comment.lua # Comment.nvim : gcc / gbc
├── completions.lua # nvim-cmp + LuaSnip + friendly-snippets
├── lsp-config.lua # Mason + mason-lspconfig + nvim-lspconfig (lua_ls, pylsp)
├── neo-tree.lua # Explorateur de fichiers
├── none-ls.lua # Formatage : stylua, black, isort (à la sauvegarde)
├── telescope.lua # Recherche de fichiers / grep (+ extension fzf native)
├── treesitter.lua # Coloration / indentation (branche master épinglée)
└── undotree.lua # Historique d'annulation visuel
Testé sur Ubuntu (26.04). Adapter les noms de paquets pour une autre distribution.
sudo apt-get install -y neovim git build-essential ripgrep unzip \
python3-venv python3-pipPourquoi chaque paquet :
| Paquet | Utilisé par |
|---|---|
neovim (≥ 0.11) |
— |
git |
lazy.nvim (clonage des plugins) |
build-essential (gcc, make) |
Compilation de telescope-fzf-native et des parsers Treesitter |
ripgrep (rg) |
Telescope live_grep |
unzip |
Mason (extraction des archives, ex. stylua) |
python3-venv, python3-pip |
Mason crée un venv pour installer pylsp, black, isort — sans python3-venv, ces installations échouent avec spawn: python3 failed with exit code 1 |
Les icônes de Neo-tree, Telescope et nvim-web-devicons nécessitent une police patchée « Nerd Font », sinon elles s'affichent en carrés vides. Installation sans sudo :
cd /tmp
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
mkdir -p ~/.local/share/fonts/JetBrainsMonoNerd
unzip -o JetBrainsMono.zip -d ~/.local/share/fonts/JetBrainsMonoNerd
fc-cache -f ~/.local/share/fontsPuis configurer le terminal pour utiliser cette police. Avec Ptyxis (terminal par défaut d'Ubuntu) :
gsettings set org.gnome.Ptyxis use-system-font false
gsettings set org.gnome.Ptyxis font-name 'JetBrainsMono Nerd Font 11'(Ouvrir un nouvel onglet pour voir le changement. Pour un autre terminal, choisir « JetBrainsMono Nerd Font » dans ses préférences. Les emoji couleur sont fournis par fonts-noto-color-emoji, installé par défaut sur Ubuntu.)
Alternative — garder sa police habituelle (ex. Monoisome sous Terminator) : installer uniquement les icônes et les déclarer en police de secours via fontconfig. Aucun changement de police dans le terminal n'est nécessaire :
cd /tmp
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/NerdFontsSymbolsOnly.zip
mkdir -p ~/.local/share/fonts/NerdFontsSymbolsOnly
unzip -o NerdFontsSymbolsOnly.zip -d ~/.local/share/fonts/NerdFontsSymbolsOnly
mkdir -p ~/.config/fontconfig
cat > ~/.config/fontconfig/fonts.conf <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Icônes Nerd Font en fallback pour les polices monospace -->
<match target="pattern">
<test name="family"><string>Monoisome</string></test>
<edit name="family" mode="append" binding="weak"><string>Symbols Nerd Font Mono</string></edit>
</match>
<match target="pattern">
<test name="family"><string>monospace</string></test>
<edit name="family" mode="append" binding="weak"><string>Symbols Nerd Font Mono</string></edit>
</match>
</fontconfig>
EOF
fc-cache -fRedémarrer complètement le terminal (toutes les fenêtres) pour que la règle soit prise en compte.
git clone <url-du-depot> ~/Documents/nvim-config
ln -s ~/Documents/nvim-config ~/.config/nvimLe lien symbolique permet de garder la config versionnée dans le dépôt : toute modification faite via ~/.config/nvim est directement commitable.
Au premier lancement de nvim, lazy.nvim se clone tout seul puis installe les plugins. Pour tout faire en une commande sans ouvrir l'interface :
nvim --headless "+Lazy! sync" +qaMason installe lua_ls et pylsp automatiquement à la première ouverture d'un fichier, mais les formatters utilisés par none-ls doivent être installés explicitement :
nvim --headless "+Lazy! load mason.nvim" \
"+MasonInstall lua-language-server python-lsp-server stylua black isort" +qa(En mode headless, :MasonInstall est synchrone — la commande attend la fin des installations.)
ls ~/.local/share/nvim/mason/bin/
# attendu : black isort lua-language-server pylsp styluaPuis ouvrir un fichier Python : le LSP doit s'attacher (:LspInfo) et la sauvegarde (:w) doit reformater le fichier avec black/isort. :checkhealth donne un diagnostic complet.
Leader = Espace.
| Touche | Mode | Action |
|---|---|---|
Ctrl+f |
n | Telescope : chercher un fichier |
<leader>f |
n | Telescope : grep dans le projet (ripgrep) |
Ctrl+n |
n | Neo-tree : ouvrir l'explorateur à gauche |
<leader>u |
n | Undotree : basculer l'historique d'annulation |
K |
n | LSP : documentation sous le curseur |
gd |
n | LSP : aller à la définition |
<leader>ca |
n | LSP : actions de code |
gcc / gbc |
n | Commenter la ligne / le bloc |
gc / gb |
n, v | Commenter (opérateur / sélection) |
gnn, grn, grm, grc |
n | Treesitter : sélection incrémentale |
Alt+e |
i | Autopairs : fast wrap |
Ctrl+j / Ctrl+k |
i | Complétion : élément suivant / précédent |
Ctrl+Espace |
i | Complétion : déclencher |
Entrée |
i | Complétion : valider |
Tab |
i | Complétion : suivant, ou étendre/sauter dans le snippet |
Ctrl+e |
i | Complétion : annuler |
nvim --headless "+Lazy! sync" +qa # Mettre à jour les pluginsDans Neovim : :Lazy (plugins), :Mason (LSP/outils), :TSUpdate (parsers Treesitter).
- nvim-treesitter est épinglé sur
branch = "master"danstreesitter.lua. La branche par défaut du dépôt est devenuemain, une réécriture qui supprime l'ancienne API (nvim-treesitter.configs) utilisée par cette config. Sans l'épinglage, le plugin échoue au chargement avecmodule 'nvim-treesitter.configs' not found. La branchemasterest archivée mais fonctionnelle ; une migration vers la nouvelle API sera nécessaire à terme. - API LSP :
lsp-config.luautilise l'API nativevim.lsp.config/vim.lsp.enablede Neovim 0.11 (l'ancien frameworkrequire('lspconfig')est déprécié). nvim-lspconfig reste installé car il fournit les définitions des serveurs. mason-lspconfig (v2) active automatiquement les serveurs installés ;styluaest exclu de cette activation car c'est un formatter (none-ls), pas un serveur LSP. - Le formatage LSP est désactivé volontairement (
documentFormattingProvider = falsedanslsp-config.lua) : c'est none-ls (stylua, black, isort) qui formate, via un autocmdBufWritePre. - Undo persistant : l'historique d'annulation survit à la fermeture, stocké dans
~/.local/share/nvim/undodir(créé automatiquement).