Configuration Neovim personnelle, moderne et minimaliste (Neovim 0.12+).
Stack actuelle : snacks.nvim (picker, explorer, indent, lazygit), blink.cmp (complétion),
nvim-treesitter (branche main), leap, tiny-inline-diagnostic, gruvbox.
Versions : la migration de stack commence à
v2.0.0; les tagsv3.0.0etv3.1.0sont également présents.v1.0.0conserve l’ancienne stack (Telescope, nvim-cmp, nvim-tree, harpoon…).lazy-lock.jsonfixe les plugins.
- Neovim >= 0.12 : exigé par le commit verrouillé de nvim-treesitter
main(l’APIvim.lsp.configexiste dès 0.11). Vérifier la version réellement installée.
# macOS
brew install neovim
# Ubuntu (snap, pour avoir la dernière stable)
sudo snap install nvim --classic
# Vérification
nvim --version# macOS
brew install git ripgrep fd lazygit tree-sitter-cli
# Ubuntu/Debian
sudo apt update
sudo apt install -y git curl ripgrep fd-find build-essential python3 unzip- git : gestion des plugins et vim-fugitive
- ripgrep / fd : recherche du picker Snacks (grep / find files)
- lazygit : interface Git dans Neovim (
<leader>lg) — optionnel - tree-sitter-cli >= 0.26.1 : compilation des parsers Treesitter (
main). Sous Linux :cargo install --locked tree-sitter-cli, ou binaire des releases officielles. Le plugin déconseille l’installation du CLI via un gestionnaire JS. - build-essential : compilateur C pour les parsers (Linux uniquement)
Ne pas utiliser pip système. Installer uv :
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install ruffInstaller un runtime Node compatible avec les serveurs choisis (Node 24 LTS est une base actuelle) et Bun pour installer les outils :
bun install -g pyright prettier bash-language-server typescript typescript-language-server svelte-language-serverBun est le gestionnaire employé par install.sh. Les lanceurs de certains
outils utilisent #!/usr/bin/env node : installer avec Bun ne dispense donc
pas automatiquement de Node. Node 20 est arrivé en fin de vie ; consulter le
calendrier Node.js.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup component add rust-analyzer
cargo install stylua # formatter LuaUtilisés par conform.nvim via <leader>f :
| Langage | Formatter | Installé via |
|---|---|---|
| Python | Ruff | uv tool install ruff |
| JS/TS/HTML/CSS/JSON/YAML/MD | Prettier | bun install -g prettier |
| Lua | StyLua | cargo install stylua / brew install stylua |
| XML | xmllint | apt install libxml2-utils / brew install libxml2 |
Note : le LSP est préféré seulement pour les filetypes sans formatter dédié. Si un formatter configuré est absent, il n’y a pas de repli LSP. Go utilise
goimportspuisgofmt; installergoimportsavecgo install golang.org/x/tools/cmd/goimports@latest.
Sous macOS :
brew install --cask font-hack-nerd-fontSous WSL2 :
- Télécharger https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Hack.zip côté Windows
- Extraire et installer les
.ttf(clic droit > Installer pour tous les utilisateurs) - Windows Terminal : Paramètres > Profil > Apparence > Police > "Hack Nerd Font Mono"
Sous Linux natif :
mkdir -p ~/.local/share/fonts && cd ~/.local/share/fonts
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Hack.zip
unzip Hack.zip && rm Hack.zip
fc-cache -fv| Langage | Serveur LSP | Installé via |
|---|---|---|
| Lua | lua-language-server | brew install lua-language-server |
| Python | Pyright | bun install -g pyright |
| Python (lint/format) | Ruff | uv tool install ruff |
| Bash | bash-language-server | bun install -g bash-language-server |
| JS/TS | typescript-language-server | bun install -g typescript-language-server typescript |
| Svelte | svelte-language-server | bun install -g svelte-language-server |
| Rust | rust-analyzer | rustup component add rust-analyzer |
| Go | gopls | go install golang.org/x/tools/gopls@latest |
| Java | jdtls | scripts/install.sh (si JDK 25+ présent) ; le bundle offline l'embarque aussi |
| Java (debug) | java-debug-adapter | scripts/install.sh, extrait de l'extension VS Code → ~/.local/share/java-debug |
| Java (tests) | vscode-java-test | scripts/install.sh, extrait de l'extension VS Code → ~/.local/share/java-test |
Les outils lua-language-server, goimports et les runtimes de langages
sont à installer séparément. L’installation de rust-analyzer est suggérée
mais pas exécutée par le script. Pour Java, JDTLS_JAVA_HOME sélectionne
la JVM de jdtls, distincte du Java du projet ; JAVA8_HOME, JAVA11_HOME,
JAVA17_HOME, JAVA21_HOME, JAVA25_HOME (et toutes les versions de 8 à 25)
déclarent les runtimes de projets disponibles. Le bundle EL8 embarque le JDK 25
du serveur ; le JDK du projet, notamment Java 8, reste distinct.
command -v lua-language-server pyright bash-language-server typescript-language-server svelteserver rust-analyzerCloner le dépôt où l'on veut, puis lancer le script :
gh repo clone cmoron/nvim-config # ou git clone git@github.com:cmoron/nvim-config.git
cd nvim-config
./scripts/install.shinstall.sh crée le symlink ~/.config/nvim → dépôt, installe les serveurs LSP
et formatters manquants, puis les plugins aux versions de lazy-lock.json. Le
dépôt reste à l'endroit choisi : toute modification y est active immédiatement.
Un dossier de configuration existant est sauvegardé en
~/.config/nvim.bak-<horodatage>. En online, un autre symlink est remplacé
sans modifier son dossier cible.
| Option | Effet |
|---|---|
-c, --check |
Vérifie prérequis et outils, n'installe rien |
-n, --dry-run |
Affiche les actions sans les exécuter |
Le script scripts/export-offline.sh exporte les 22 plugins verrouillés,
les parsers natifs disponibles et les composants Java installés. Il requiert
Python 3 et Git pour vérifier le lockfile, et refuse les plugins absents,
modifiés ou à un autre commit. Les anciens plugins hors lockfile sont exclus.
Les fichiers non suivis (dont les binaires blink) restent copiés.
# Si nécessaire, restaurer les versions voulues dans Neovim : :Lazy restore
# Puis mettre à jour les parsers pour ce commit : :TSUpdate
scripts/export-offline.sh
# → dist/nvim-config-offline.tar.gzL’export local ne fournit Neovim que si NVIM_TARBALL pointe vers une archive
nvim-linux-*.tar.gz. Il ne fournit ni JDK, ni runtime Node, ni LSP externes,
ni formatters, ni rg/fd/git/lazygit. Un dossier de parsers vide est signalé ;
le bundle reste incomplet pour la coloration hors ligne. Java est inclus
seulement si les composants étaient installés sur la machine d’export.
PLATFORM vérifie l’OS et le CPU, pas la compatibilité glibc/libstdc++.
Les parsers exportés doivent correspondre au plugin Treesitter verrouillé.
Le wrapper Linux construit dans Docker (fedora:43 par défaut), embarque
Neovim v0.12.5 et utilise le CLI Tree-sitter v0.26.1 officiel :
scripts/export-offline-linux.sh
ARCH=arm64 scripts/export-offline-linux.sh
# → dist/nvim-config-offline-linux-{x86_64,arm64}.tar.gz
# Réglages : NVIM_VERSION, TREE_SITTER_VERSION, BUN_VERSION, IMAGE (base dnf compatible)Le build exige un Docker fonctionnel et du réseau. Les versions des plugins et jdtls 1.61.0 sont verrouillés, mais l’image Fedora de base et les extensions VS Code restent mobiles : le build n’est pas encore entièrement reproductible. L’archive du 18 septembre 2026 est validée sur Fedora 43 et UBI 9.6 (base RHEL 9), sans root ni réseau. Elle est incompatible avec Oracle Linux 8. La recette dédiée ci-dessous remplace le runtime pour OL8 et ajoute les outils Java/Python. Chaque nouvelle archive doit repasser la recette sur ses cibles.
scripts/export-offline-el8.sh
# → dist/nvim-config-offline-el8-x86_64.tar.gz et .sha256Ce bundle EL8 fournit Neovim 0.12.5 compilé sur OL8, jdtls 1.61.0, un JDK 25 privé, Node 24, Pyright et Ruff. Il réutilise les plugins et parsers du bundle Linux. Les JDK des projets Java 8 à 24, les environnements Python et les dépendances Maven/Gradle restent à fournir. Voir le guide OL8 Java/Python pour les commandes et la matrice de validation. Voir l’étude de packaging Enterprise Linux et l’évaluation de compilation OL8 et des versions Neovim.
Sur la cible :
tar -xzf nvim-config-offline.tar.gz
./nvim-config-offline/install.shL’installation ne demande pas de droits root. La configuration, les données
Neovim et les composants Java remplacés sont déplacés vers des sauvegardes
.bak-<date>-<pid> ; un symlink n’est pas suivi. Ces sauvegardes sont conservées
jusqu’à suppression manuelle. Le runtime embarqué et le lanceur ~/.local/bin/nvim sont également
sauvegardés avant remplacement. Ajouter ~/.local/bin au PATH.
Les scripts utilisent les chemins HOME standards, sans prise en charge XDG
personnalisée. Consulter aussi les README et DEPENDENCIES générés dans le bundle.
Les GitHub Releases hébergent
le bundle EL8 qualifié et son SHA-256. Les binaires ne sont pas committés ;
les caches de build vivent sous ~/.cache/nvim-config/.
bash scripts/test-packaging.sh # fixtures isolées, aucun téléchargement
shellcheck scripts/*.sh
stylua --check init.lua scripts/check-runtime.lua scripts/check-lsp.lua
scripts/install.sh --check
# Après construction du bundle ; Docker doit disposer de l'image cible :
bash scripts/test-offline-linux.sh
bash scripts/test-offline-linux.sh dist/nvim-config-offline-linux-x86_64.tar.gz registry.access.redhat.com/ubi9/ubi:9.6Les tests de packaging vérifient les installations et sauvegardes avec de faux binaires ; ils ne prouvent pas l’ABI d’une cible Linux. Le test Docker installe l’archive sous un utilisateur non privilégié, sans réseau, puis charge les 23 parsers, leurs queries et le moteur Rust de blink. Le wrapper exécute aussi ce contrôle de runtime avant de publier l’archive. Voir le rapport de revue pour les validations réelles et les limites restantes.
Leader key : Espace
| Raccourci | Description |
|---|---|
F9 |
Toggle explorer de fichiers |
<leader><Tab> |
Révéler le fichier courant dans l'explorer / y revenir depuis l'explorer |
Ctrl-P |
Recherche de fichiers |
<leader>p |
Liste des buffers |
<leader>g |
Recherche de texte (live grep) |
<leader>fh |
Recherche dans l'aide |
<leader>fd |
Liste des diagnostics |
<leader>fr |
Références LSP |
<leader>fs |
Symboles du document |
Dans un picker :
Ctrl-j/Ctrl-k- Naviguer dans les résultatsEnter- Ouvrir /Escouq- Fermer/- Basculer entre champ de recherche et liste
Dans l'explorer :
Enteroul- Ouvrir / déplier,h- replier,<BS>- dossier parentanouveau fichier,dsupprimer (corbeille),rrenommer,m/cdéplacer/copierHtoggle fichiers cachés,Itoggle gitignorés,Ptoggle preview,qfermer
Le picker affiche les fichiers cachés et respecte .gitignore nativement.
| Raccourci | Description |
|---|---|
Tab |
Buffer suivant |
Shift-Tab |
Buffer précédent |
F12 ou <leader>b |
Liste des buffers (picker) |
<leader>x |
Fermer le buffer en gardant les fenêtres |
Les buffers ouverts sont affichés en onglets (bufferline).
| Raccourci | Description |
|---|---|
s{char}{char} |
Sauter vers 2 caractères (labels) |
S{char}{char} |
Sauter vers une autre fenêtre |
Popup automatique avec suggestions LSP (avec documentation), snippets, mots du buffer, chemins.
| Raccourci | Description |
|---|---|
Tab / Shift-Tab |
Élément suivant/précédent (ou saut de placeholder de snippet) |
Enter |
Confirmer (sélectionne le 1er élément si aucun choix) |
Ctrl-y |
Confirmer (alternative) |
Ctrl-e |
Fermer le popup |
Ctrl-Space |
Forcer l'affichage |
Ctrl-f / Ctrl-b |
Scroller la documentation |
Les parenthèses sont ajoutées automatiquement à l'acceptation d'une fonction (auto_brackets).
Actifs quand un serveur LSP est attaché (Lua, Python, Bash, JS/TS, Svelte, Rust, Go, Java)
| Raccourci | Description |
|---|---|
gd |
Go to Definition |
gD |
Go to Declaration |
grr |
Find References |
gri |
Go to Implementation |
gO |
Document symbols (outline) |
H |
Hover (documentation) |
<leader>n / <leader>N |
Diagnostic suivant/précédent |
<leader>e |
Erreur détaillée en float |
grn ou <leader>rn |
Rename |
gra ou <leader>ca |
Code Action |
Les diagnostics s'affichent en inline discret sur la ligne du curseur (tiny-inline-diagnostic, preset ghost) — pas de virtual text permanent.
| Raccourci | Mode | Description |
|---|---|---|
gcc |
Normal | Toggle commentaire ligne courante |
gc |
Visuel | Toggle commentaire de la sélection |
<leader>c<leader> |
Normal/Visuel | Alias historique |
| Raccourci | Description |
|---|---|
<leader>lg |
LazyGit (interface complète en float) |
Fugitive (mode commande) : :Git status, :Git blame, :Gdiffsplit, :Git push…
Gitsigns : modifications affichées dans la marge (+, ~, _).
| Raccourci | Mode | Description |
|---|---|---|
<leader>f |
Normal | Formater le buffer (conform.nvim) |
Shift-Tab |
Insertion | Complétion/snippet si actif, sinon déindentation |
J / K |
Normal | Scroll rapide bas (2 lignes) / haut (3 lignes) |
Note :
Kest utilisé pour le scroll. Pour la documentation LSP, utiliserH.
| Raccourci | Description |
|---|---|
<leader><Enter> |
Ancien raccourci :source (rechargement partiel, déconseillé) |
Redémarrer Neovim après modification : lazy.nvim ne prend pas en charge le rechargement complet et les autocmds se dupliquent avec ce raccourci.
Tapez <leader> et attendez le délai du plugin (preset modern) → popup des raccourcis disponibles :
<leader>f...- Find/Format<leader>c...- Comment<leader>l...- LazyGit
| Touche | Action |
|---|---|
F9 |
Toggle explorer |
F12 |
Liste des buffers |
- lazy.nvim — Gestionnaire de plugins : bootstrap automatique au premier
lancement, versions figées par
lazy-lock.json, chargement paresseux (event,ft,keys) pour un démarrage rapide. - gruvbox.nvim (ellisonleao) — Colorscheme. Port Lua qui définit
NormalFloatet les groupes treesitter, contrairement au gruvbox historique qui laissait un fond noir sur les fenêtres flottantes.
- snacks.nvim — Couteau suisse qui remplace à lui seul Telescope, NvimTree
et BufExplorer. Modules activés : picker (fichiers
Ctrl-P, grep<leader>g, buffers, aide, diagnostics, références et symboles LSP), explorer (F9, révélation du fichier courant<leader><Tab>), indent (guides d'indentation) et lazygit (<leader>lg). - leap.nvim — Saut vers n'importe quel point visible en tapant 2 caractères
puis un label (
sdans la fenêtre courante,Svers une autre fenêtre). Installé depuis son miroir Codeberg. - bufferline.nvim — Onglets de buffers en haut de l'écran (
Tab/Shift-Tabpour naviguer), avec un décalage réservé à l'explorer.
- lualine — Barre de statut (thème gruvbox) : mode, branche Git, diagnostics, position.
- which-key — Popup des raccourcis disponibles après
<leader>(délai du plugin), avec les groupes Find/Format, Comment et LazyGit. - tiny-inline-diagnostic — Diagnostics affichés en fin de ligne du curseur uniquement (preset « ghost », multi-lignes) : pas de virtual text permanent qui pollue tout l'écran.
- nvim-colorizer (fork NvChad) — Prévisualisation des couleurs dans le
buffer (
#RRGGBB,rgb(),hsl(), noms CSS), tous filetypes. - nvim-web-devicons — Icônes de filetypes (dépendance de bufferline et lualine, nécessite une Nerd Font).
- gitsigns — Hunks dans la gouttière (
+,~,_) sur l'état du working tree. - vim-fugitive — Git en mode commande :
:Git status,:Git blame,:Gdiffsplit,:Git push… - lazygit (via snacks.nvim) — Interface Git complète en fenêtre flottante
(
<leader>lg). Nécessite le binairelazygitsur la machine.
- nvim-autopairs — Fermeture automatique des parenthèses, quotes et
crochets ; l'insertion des parenthèses à l'acceptation d'une complétion est
gérée par blink.cmp (
auto_brackets). - conform.nvim — Formatage à la demande (
<leader>f, jamais à la sauvegarde) : stylua, ruff, prettier, xmllint, goimports selon le filetype, trim des espaces partout, et délégation au serveur LSP pour les langages sans formatter dédié.
- blink.cmp — Moteur de complétion (LSP, chemins, snippets, mots du buffer) avec documentation intégrée. Le matching flou repose sur un binaire Rust précompilé — pas de dépendance à cargo, et le bundle offline l'embarque.
- friendly-snippets — Collection de snippets communautaires consommée par blink.cmp.
- nvim-lspconfig — Définitions des serveurs LSP, activés via l'API native
vim.lsp.enable()(voir la section « Serveurs LSP »). - nvim-jdtls — Intégration Java : chargé uniquement sur
ft=java, gère le workspace jdtls, la détection de racine de projet (Maven, Gradle, Ant), la JVM du serveur (JDTLS_JAVA_HOME) séparée de celle du projet, et branche java-debug / vscode-java-test sur nvim-dap. - nvim-dap + nvim-dap-ui (+ nvim-nio) — Débogueur : breakpoints
(
<leader>db, conditionnel<leader>dB), exécutionF5/F10/F11, panneaux ouverts automatiquement au premier arrêt réel — un test qui passe ne fait pas clignoter l'écran.
- nvim-treesitter (branche
main) — Coloration et analyse syntaxiques. La liste des parsers (23 entrées) est exposée dansvim.g.ts_parsers, compilée au premier lancement avec interface (CLItree-sitter+ compilateur C) et précompilée dans le bundle offline. Sans interface attachée, le script de build déclenche et attend explicitement l’installation ; un serveur Neovim démarré sans UI demande également une installation explicite.
Pour désactiver un LSP, retirez-le de la liste dans init.lua :
vim.lsp.enable({ "pyright", "bashls", "ts_ls", "svelte", "rust_analyzer", "ruff", "lua_ls", "gopls" })Le pense-bête Java détaille le parcours.
<leader>tc lance les tests de la classe, <leader>tm la méthode courante
(si le lanceur Java est présent). F5 lance/continue, F10 avance sans entrer,
F11 entre, <leader>do sort, <leader>dt arrête, <leader>du ouvre les panneaux.
<leader>db pose un breakpoint et <leader>dB un breakpoint conditionnel.
Le serveur et les dépendances Maven/Gradle doivent être provisionnés avant
utilisation hors ligne.
→ Vérifiez que Hack Nerd Font est installée et sélectionnée dans votre terminal
→ Les parsers Treesitter (branche main) se compilent au premier lancement :
vérifiez tree-sitter --version et qu'un compilateur C est présent
→ Aucun serveur LSP attaché : vérifiez :lua print(vim.inspect(vim.lsp.get_clients()))
et l'installation du serveur (section "Serveurs LSP")
→ Installez le binaire : brew install lazygit / voir https://github.com/jesseduffield/lazygit
→ autoread est activé dans la config ; les fichiers sont rechargés au focus/changement de buffer
Tous les réglages sont dans ~/.config/nvim/init.lua, organisé en sections :
- Settings de base
- Autocmds (indentation par filetype)
- Mappings
- Bootstrap lazy.nvim
- Plugins (avec configurations détaillées)
- Configuration LSP
- Java (jdtls)
N'hésitez pas à adapter selon vos besoins !