Configuration Neovim
Une configuration Neovim rapide et orientée TypeScript/JavaScript, construite sur NvChad v2.5, avec synchronisation automatique du thème macOS, une chaîne d'outils lint/format propulsée par oxc, et une intégration aux panneaux Zellij.
Cette configuration se trouve dans nvim/ au sein de mon monorepo dotfiles, aux côtés de mes outils shell, terminal et macOS.
Points forts
- Thème adaptatif au système — lit
AppleInterfaceStylede macOS au démarrage et bascule automatiquement entregithub_dark/github_light(même logique de détection réutilisée pour l'ombrage detoggleterm) - Chaîne d'outils JS/TS orientée oxc — oxlint pour le linting et un formateur
oxfmtpersonnalisé branché sur conform.nvim, avec typescript-tools.nvim pilotant une instancetsserverrapide (pas dets_lsvia Mason) et des commandes dédiées à l'auto-import - Tableau de bord personnalisé — l'écran d'accueil NvDash est réécrit pour lister les fichiers récents et les projets récents (suivis via une autocommande) avec des raccourcis à une seule lettre
- Navigation consciente de Zellij —
<C-hjkl>déplace le focus entre les splits Neovim et les panneaux Zellij de manière transparente - Interface Noice ajustée — la ligne de commande, le popupmenu et le hover/signature LSP passent par noice.nvim, avec filtrage des messages de progression LSP bruyants et des "aucun résultat"
- Discord Rich Presence — activable à la demande avec
:DiscordRichPresence(encapsule cord.nvim) - Outils gérés par Mason — serveurs LSP, linters et formateurs sont déclarés une seule fois dans
chadrc.luaet installés automatiquement
Prérequis
- Neovim >= 0.10.0
- Git
- Nerd Font (JetBrains Mono, défini comme
guifont) - Node.js (pour les serveurs LSP)
- ripgrep (recherche live Telescope)
- Zellij (optionnel, pour la navigation entre panneaux)
Installation
Cette configuration fait partie d'un repo dotfiles plus large, donc nvim/ est un sous-répertoire plutôt qu'une racine de repo autonome.
# Sauvegarder la configuration existante
mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak
# Cloner le repo dotfiles et créer un lien symbolique vers la config nvim
git clone git@github.com:UgolinOlle/dotfiles.git ~/dotfiles
ln -s ~/dotfiles/nvim ~/.config/nvim
# Démarrer Neovim — les plugins et outils Mason s'installent automatiquement
nvimStructure
nvim/
├── init.lua # Point d'entrée, bootstrap lazy.nvim
├── .stylua.toml # Règles de formatage Lua
├── .neoconf.json # Paramètres neodev/neoconf pour lua_ls
├── lua/
│ ├── chadrc.lua # Config NvChad : détection de thème, UI, liste d'outils Mason
│ ├── options.lua # Options Vim
│ ├── mappings.lua # Raccourcis clavier
│ ├── autocmds.lua # Autocommandes
│ ├── commands.lua # Commandes utilisateur personnalisées (DiscordRichPresence)
│ ├── configs/
│ │ ├── conform.lua # Configuration des formateurs (oxfmt, prettier, stylua...)
│ │ ├── lspconfig.lua # Configuration des serveurs LSP + raccourcis d'import
│ │ ├── lint.lua # Configuration nvim-lint (oxlint)
│ │ ├── noice.lua # Interface Noice + filtrage des messages
│ │ ├── nvdash.lua # Tableau de bord personnalisé (fichiers/projets récents)
│ │ ├── lazy.lua # Options de lazy.nvim
│ │ ├── cmp.lua # Configuration de la complétion
│ │ └── luasnip.lua # Configuration des snippets
│ └── plugins/
│ ├── init.lua # Spécifications des plugins
│ ├── telescope.lua # Configuration Telescope + ui-select
│ └── gitgraph.lua # Plugin de graphe gitPlugins
| Catégorie | Plugin | Rôle |
|---|---|---|
| Base | NvChad | Framework de configuration de base |
| LSP | nvim-lspconfig | Configuration du client LSP |
| mason.nvim + mason-lspconfig | Installateur d'outils LSP/lint/format | |
| typescript-tools.nvim | Serveur TS/JS rapide, auto-import, corrections | |
| nvim-lspimport | Auto-import multi-langage | |
| Complétion | nvim-cmp | Moteur d'autocomplétion |
| LuaSnip + friendly-snippets | Moteur de snippets + collection de snippets | |
| nvim-autopairs | Fermeture auto des accolades, intégration cmp | |
| Format/Lint | conform.nvim | Exécuteur de formateurs, format à la sauvegarde |
| nvim-lint | Linting asynchrone (oxlint) | |
| UI | noice.nvim | Ligne de commande, popupmenu, UI hover LSP |
| nvim-notify | Gestionnaire de notifications | |
| indent-blankline.nvim | Guides d'indentation | |
| markview.nvim | Aperçu Markdown | |
| nvim-web-devicons | Icônes de fichiers | |
| Navigation | telescope.nvim (+ ui-select) | Recherche floue |
| zellij-nav.nvim | Navigation entre panneaux Zellij | |
| Git | gitsigns.nvim | Décorations git, aperçu de hunks, blame |
| gitgraph.nvim | Visualisation du graphe git | |
| Édition | nvim-surround | Objets texte d'encadrement |
| Comment.nvim | Commentaires intelligents | |
| nvim-treesitter + textobjects | Coloration syntaxique et objets texte avancés | |
| Terminal | toggleterm.nvim | Gestion du terminal, ombrage adapté au thème |
| Autre | cord.nvim | Discord Rich Presence |
Raccourcis clavier
Touche leader : Espace
Général
| Touche | Mode | Action |
|---|---|---|
<leader>w | n | Enregistrer le fichier |
Q | n | Fermer la fenêtre |
; | n | Entrer en mode commande |
jk / kj | i | Quitter le mode insertion |
<leader><leader> | n | Rechercher des fichiers (Telescope) |
sv / ss | n | Diviser verticalement / horizontalement |
<leader>b | n | Nouveau buffer |
<leader>th | n | Changer de thème (Telescope) |
<leader>nn | n | Fermer les notifications (Noice) |
LSP & Imports
| Touche | Mode | Action |
|---|---|---|
K | n | Documentation au survol (bordure arrondie) |
<leader>ca | n | Actions de code |
<leader>fm | n, v | Formater le fichier / la sélection |
<leader>dy | n | Copier le diagnostic sous le curseur dans le presse-papiers |
<leader>ih | n | Basculer les inlay hints |
<leader>l | n | Déclencher le lint |
<leader>io / <leader>ia | n | Importer le symbole sous le curseur / importer tout ce qui manque |
<leader>to / <leader>ts | n | Organiser les imports / trier les imports (TS) |
<leader>tr / <leader>ti | n | Supprimer les imports inutilisés / ajouter les imports manquants (TS) |
<leader>tf | n | Corriger tous les problèmes TS |
Git
| Touche | Mode | Action |
|---|---|---|
<leader>gp | n | Aperçu du hunk |
<leader>gb | n | Blame de la ligne |
<leader>gl | n | Dessiner le graphe git |
Navigation & Terminal
| Touche | Mode | Action |
|---|---|---|
<C-h/j/k/l> | n | Naviguer entre les panneaux Zellij |
<C-\> | n, t | Basculer le terminal |
Serveurs LSP
Installés automatiquement via Mason (chadrc.lua) et configurés dans configs/lspconfig.lua :
| Langage | Serveur |
|---|---|
| Lua | lua_ls (avec les chemins de bibliothèques NvChad/Lazy préchargés) |
| TypeScript/JavaScript | typescript-tools.nvim (plugin dédié, pas via Mason) |
| HTML | html |
| CSS | cssls, tailwindcss |
| Web (JSON/CSS-in-JS) | biome |
| Emmet | emmet_ls |
| ESLint | eslint |
| Bash | bashls |
| JSON | json-lsp |
| Docker | dockerfile-language-server, docker-compose-language-service |
| Markdown | marksman |
Formatage & Linting
Le formatage et le linting JS/TS s'appuient sur oxc pour la rapidité ; tout le reste utilise Prettier ou des formateurs dédiés. Le format à la sauvegarde est activé via conform.nvim (configs/conform.lua), le linting s'exécute sur BufEnter / BufWritePost / InsertLeave via nvim-lint (configs/lint.lua).
| Langage | Formateur | Linter |
|---|---|---|
| Lua | stylua | — |
| JavaScript/TypeScript (+ JSX/TSX) | oxfmt (oxc) | oxlint |
| JSON/JSONC | prettier | — |
| HTML/CSS | prettier | — |
| Markdown | prettier | — |
| YAML | prettier | — |
| SQL | sqlfmt | — |
| Shell (sh/bash/zsh) | shfmt | — |
Langages Treesitter
Installés automatiquement : vim, lua, vimdoc, html, css, javascript, typescript, tsx, json, yaml, markdown, bash
Personnalisation
Thème
Le thème se synchronise automatiquement avec l'apparence système de macOS (lua/chadrc.lua). Pour fixer un thème manuellement :
-- lua/chadrc.lua
M.base46 = {
theme = "github_dark", -- ou n'importe quel thème NvChad
}Ajouter des serveurs LSP
-- lua/configs/lspconfig.lua
local servers = {
"html",
"cssls",
-- ajoutez votre serveur ici
}Ajouter des formateurs
-- lua/configs/conform.lua
formatters_by_ft = {
python = { "black" },
-- ajoutez votre formateur ici
}Licence
Unlicense — domaine public.