Installer une version récente de Neovim, comprendre ce qu’il ajoute à Vim, puis construire pas à pas une config init.lua avec thème, recherche de fichiers, explorateur, et LSP (erreurs soulignées, autocomplétion, renommage) pour Python et Bash.
Prérequis
Les touches sont exactement celles de Vim : modes, i, Échap, :wq, dd, yy, :%s… → apprends d’abord O10 - Vim. Cette fiche ne couvre que ce que Neovim ajoute.
1. Neovim, c’est quoi ?
Neovim (nvim) est un fork de Vim lancé en 2014 : même éditeur modal, mais repensé pour être facile à étendre.
flowchart LR
T["Toi"] --> N["Neovim (nvim)"]
N --> C["~/.config/nvim/init.lua<br/>ta config en Lua"]
C --> P["vim.pack<br/>gestionnaire de plugins intégré"]
P --> PL["Plugins<br/>thème, recherche, Mason..."]
PL -->|"Mason installe"| S["Serveurs de langage<br/>pyright, bashls, lua_ls"]
N <-->|"protocole LSP"| S
Le LSP en une phrase
Un serveur de langage (Language Server) est un petit programme qui « comprend » un langage. Neovim lui envoie ton fichier ; il répond avec les erreurs, les complétions, la définition d’une fonction… C’est exactement ce que fait VS Code (O02 - VS Code) en coulisses.
2. Installer une version récente
La version apt de Pop!_OS est trop vieille
Vérifié sur ton poste : apt fournit Neovim 0.9.5 (2023). La version stable actuelle est la 0.12.5 (août 2026). Le gestionnaire de plugins vim.pack (0.12) et la config LSP simplifiée vim.lsp.enable (0.11) n’existent pas en 0.9 → la config de cette fiche planterait.
2.1 Avec le script du vault (recommandé)
Il gère Pop!_OS et Arch, installe les outils utiles (ripgrep, presse-papiers…) et sert aussi à mettre à jour.
cd "$HOME/obsidian/truc non trier/scripts/linux"./installer_neovim.sh
# 1. Télécharger l'archive officielle de la dernière version stablecd /tmpcurl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz# 2. L'extraire dans /opt (dossier des logiciels installés "à la main")sudo rm -rf /opt/nvim-linux-x86_64sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz# 3. Créer un raccourci dans /usr/local/bin (prioritaire sur /usr/bin dans le PATH)sudo ln -sf /opt/nvim-linux-x86_64/bin/nvim /usr/local/bin/nvimhash -r # le shell oublie l'ancien chemin de nvim# 4. Faire pointer "vi" et "vim" vers ce Neovim (sinon ils lancent la 0.9.5)for nom in vi vim; do sudo update-alternatives --install /usr/bin/$nom $nom /usr/local/bin/nvim 110 sudo update-alternatives --set $nom /usr/local/bin/nvimdone# 5. Vérifiernvim --version | head -1 # NVIM v0.12.xreadlink -f "$(which vim)" # /opt/nvim-linux-x86_64/bin/nvim
2.3 Sur Arch
sudo pacman -S neovim ripgrep wl-clipboard # les dépôts Arch sont à jour
2.4 Outils dont la config a besoin
Outil
Pourquoi
Sur ton Pop!_OS
git
vim.pack télécharge les plugins avec Git
✅
curl, unzip, tar, gzip
Mason télécharge les serveurs LSP
✅
npm (Node.js)
pyright et bash-language-server sont des paquets npm
✅
ripgrep (rg)
recherche de texte dans tout un projet
❌ → le script l’installe
wl-clipboard (Wayland) / xclip (X11)
copier-coller avec le reste du bureau
✅
une Nerd Font
icônes (facultatif)
JetBrainsMono NF sur Arch uniquement
3. Premiers pas
nvim fichier.py # ouvrir un fichiernvim . # ouvrir le dossier courant (explorateur intégré)nvim --clean # démarrer SANS ta config (dépannage)
Si les deux existent, Neovim affiche une erreur E5422: Conflicting configs. Si tu as créé init.vim (astuce de O10, partie 7.2), supprime-le quand tu passes à init.lua. Et à partir de là, ~/.vimrc n’est plus lu du tout : ses réglages sont repris dans la partie 6.
5. Le Lua minimum pour lire une config
Lua
Sens
-- texte
commentaire
vim.opt.number = true
régler une option (= :set number)
vim.g.mapleader = " "
variable globale de Neovim
local raccourci = vim.keymap.set
ranger quelque chose dans une variable locale
{ "a", "b" }
une table (liste)
{ desc = "Enregistrer" }
une table avec des clés (comme un dictionnaire Python)
require("module").setup()
charger un plugin et l’activer
function() ... end
une fonction (comme def en Python)
"a" .. "b"
concaténer des textes (= "a" + "b" en Python)
Les raccourcis : vim.keymap.set(mode, touches, action, options)
mode : "n" Normal, "i" Insertion, "v" Visuel, "t" Terminal
<leader> : la touche leader, ici Espace → <leader>w = Espace puis w
Cette config complète a été testée sur ton Pop!_OS avec Neovim 0.12.5 : les 5 plugins s’installent, le thème se charge, pyright est installé par Mason et détecte bien une erreur dans un fichier Python.
Copie-la en entier (ou section par section, en relançant nvim à chaque étape pour comprendre ce que chacune apporte) :
-- =====================================================================-- ~/.config/nvim/init.lua — config Neovim de la fiche O12 (Neovim 0.12+)-- =====================================================================-- ---------- 1. Options -----------------------------------------------vim.g.mapleader = " " -- touche "leader" = Espace (à définir AVANT les raccourcis)vim.g.maplocalleader = " "local option = vim.optoption.number = true -- numéros de ligneoption.relativenumber = true -- numéros relatifs (pratique pour 5j, 3dd...)option.mouse = "a" -- souris partoutoption.clipboard = "unnamedplus" -- y / p utilisent le presse-papiers du systèmeoption.ignorecase = true -- recherche insensible à la casse...option.smartcase = true -- ...sauf si on tape une majusculeoption.tabstop = 4 -- une tabulation = 4 colonnesoption.shiftwidth = 4 -- >> et << décalent de 4option.expandtab = true -- Tab insère des espaces (Python, YAML)option.smartindent = true -- indentation automatique "intelligente"option.cursorline = true -- surligne la ligne du curseuroption.termguicolors = true -- vraies couleurs (nécessaire pour les thèmes)option.signcolumn = "yes" -- colonne à gauche pour les erreurs (le texte ne bouge plus)option.undofile = true -- garder l'historique d'annulation après fermetureoption.scrolloff = 8 -- garder 8 lignes visibles autour du curseuroption.splitright = true -- :vsplit ouvre à droiteoption.splitbelow = true -- :split ouvre en basoption.wrap = false -- pas de retour à la ligne visueloption.completeopt = { "menuone", "noselect", "popup" } -- comportement du menu d'autocomplétion-- ---------- 2. Raccourcis --------------------------------------------local raccourci = vim.keymap.setraccourci("n", "<leader>w", "<cmd>write<cr>", { desc = "Enregistrer" })raccourci("n", "<leader>q", "<cmd>quit<cr>", { desc = "Quitter la fenêtre" })raccourci("n", "<Esc>", "<cmd>nohlsearch<cr>", { desc = "Effacer le surlignage" })raccourci("n", "<C-h>", "<C-w>h", { desc = "Fenêtre de gauche" })raccourci("n", "<C-j>", "<C-w>j", { desc = "Fenêtre du bas" })raccourci("n", "<C-k>", "<C-w>k", { desc = "Fenêtre du haut" })raccourci("n", "<C-l>", "<C-w>l", { desc = "Fenêtre de droite" })raccourci("n", "<leader>t", "<cmd>botright split | resize 12 | terminal<cr>", { desc = "Terminal en bas" })raccourci("t", "<Esc><Esc>", <C-\><C-n>, { desc = "Sortir du mode terminal" })raccourci("v", "<", "<gv", { desc = "Désindenter (garde la sélection)" })raccourci("v", ">", ">gv", { desc = "Indenter (garde la sélection)" })-- ---------- 3. Plugins (gestionnaire intégré : vim.pack) --------------local function github(depot) return "https://github.com/" .. depotendvim.pack.add({ { src = github("catppuccin/nvim"), name = "catppuccin" }, -- thème (le dépôt s'appelle "nvim", on le renomme) github("folke/which-key.nvim"), -- affiche les raccourcis disponibles github("nvim-mini/mini.nvim"), -- boîte à outils : recherche, explorateur, barre d'état... github("neovim/nvim-lspconfig"), -- configurations prêtes pour les serveurs LSP github("mason-org/mason.nvim"), -- installe les serveurs LSP})-- Thème sombrerequire("catppuccin").setup({ flavour = "mocha" })vim.cmd.colorscheme("catppuccin")-- Aide-mémoire des raccourcis : appuie sur Espace et attends une seconderequire("which-key").setup()-- Modules de mini.nvimrequire("mini.statusline").setup() -- barre d'état en bas (mode, fichier, position)require("mini.pairs").setup() -- ferme automatiquement ( [ { " 'require("mini.pick").setup() -- recherche floue de fichiers / de texterequire("mini.files").setup() -- explorateur de fichiersraccourci("n", "<leader>ff", "<cmd>Pick files<cr>", { desc = "Chercher un fichier" })raccourci("n", "<leader>fg", "<cmd>Pick grep_live<cr>", { desc = "Chercher du texte" })raccourci("n", "<leader>fb", "<cmd>Pick buffers<cr>", { desc = "Fichiers ouverts" })raccourci("n", "<leader>fh", "<cmd>Pick help<cr>", { desc = "Chercher dans l'aide" })raccourci("n", "<leader>e", function() require("mini.files").open() end, { desc = "Explorateur de fichiers" })-- ---------- 4. LSP : erreurs, complétion, renommage --------------------require("mason").setup() -- :Mason pour installer les serveurs-- lua_ls : déclarer "vim" comme connu (sinon il souligne tout init.lua)vim.lsp.config("lua_ls", { settings = { Lua = { diagnostics = { globals = { "vim" } } } },})vim.lsp.enable({ "pyright", "bashls", "lua_ls" })vim.diagnostic.config({ virtual_text = true }) -- affiche l'erreur au bout de la ligne-- Autocomplétion automatique quand un serveur LSP s'attache au fichiervim.api.nvim_create_autocmd("LspAttach", { callback = function(evenement) local client = vim.lsp.get_client_by_id(evenement.data.client_id) if client and client:supports_method("textDocument/completion") then vim.lsp.completion.enable(true, client.id, evenement.buf, { autotrigger = true }) end end,})raccourci("n", "gd", vim.lsp.buf.definition, { desc = "Aller à la définition" })raccourci("n", "<leader>cf", function() vim.lsp.buf.format() end, { desc = "Formater le fichier" })raccourci("n", "<leader>cd", vim.diagnostic.open_float, { desc = "Détail de l'erreur sous le curseur" })
6.1 Premier lancement
nvim → Neovim affiche la liste des 5 plugins à installer et demande confirmation → accepte.
Les plugins se téléchargent (quelques secondes), puis le thème apparaît.
Installe les serveurs de langage (une seule fois) :
:restart, puis ouvre un fichier .py : les erreurs apparaissent en bout de ligne.
shellcheck vérifie tes scripts Bash
bash-language-server l’utilise automatiquement s’il est installé : guillemets oubliés, variables non définies… Parfait pour les scripts du TP déploiement et de L07 - Scripting Bash.
7. Gérer les plugins avec vim.pack
flowchart LR
A["Ajouter une ligne<br/>dans vim.pack.add"] --> R[":restart"]
R --> I["Installation auto<br/>(confirmation)"]
I --> U[":lua vim.pack.update()"]
U --> V{"Relire les changements"}
V -->|":w"| OK["Mises à jour appliquées"]
V -->|":q"| NO["Annulé"]
Je veux…
Comment
ajouter un plugin
ajouter github("auteur/depot") dans vim.pack.add({...}), puis :restart
mettre à jour tous les plugins
:lua vim.pack.update() → un onglet liste les changements → :w pour valider, :q pour annuler
le fichier ~/.config/nvim/nvim-pack-lock.json les enregistre : ne pas le modifier à la main
Et lazy.nvim ?
Avant la 0.12, il fallait un gestionnaire externe (le plus connu : lazy.nvim). Beaucoup de tutos et de configs toutes faites l’utilisent encore ; vim.pack est intégré et suffit largement pour débuter.
8. Les outils de la config au quotidien
8.1 Trouver un fichier ou du texte (mini.pick)
Raccourci
Effet
Espace f f
chercher un fichier par son nom (tape quelques lettres, pas besoin du nom exact)
Espace f g
chercher du texte dans tout le projet (nécessite ripgrep)
Espace f b
basculer entre les fichiers déjà ouverts
Espace f h
chercher dans l’aide
Dans la fenêtre de recherche : Ctrl+n / Ctrl+p (ou flèches) pour descendre/monter, Entrée pour ouvrir, Échap pour fermer.
8.2 Explorer les fichiers (mini.files) - Espace e
Touche
Effet
l / h
entrer dans un dossier (ou ouvrir un fichier) / remonter
q
fermer
éditer la liste comme du texte
o puis un nom = créer · dd = supprimer · renommer en modifiant le nom
=
appliquer les changements (une confirmation est demandée)
8.3 Fenêtres et terminal
Raccourci
Effet
:vs fichier / :sp fichier
ouvrir à droite / en bas
Ctrl+h/j/k/l
changer de fenêtre (gauche/bas/haut/droite)
Espace t
terminal en bas de l’écran
Échap Échap
sortir du mode terminal (pour faire défiler, copier…) puis i pour y retaper
8.4 which-key
Appuie sur Espace et attends : une fenêtre liste tous les raccourcis qui commencent par Espace, avec leur description (desc). Pas besoin de tout retenir.
9. Le LSP au quotidien
Raccourci
Effet
K
documentation de la fonction / variable sous le curseur (K deux fois pour entrer dedans)
gd
aller à la définition (Ctrl+o pour revenir)
grr
lister toutes les utilisations
grn
renommer partout (variable, fonction)
gra
actions proposées (ex. ajouter un import manquant)
]d / [d
erreur suivante / précédente
Espace c d
détail de l’erreur
Espace c f
formater le fichier (si le serveur sait le faire)
Ctrl+s (mode insertion)
aide sur les paramètres de la fonction en cours
Autocomplétion (mode insertion) : le menu s’ouvre tout seul → Ctrl+n / Ctrl+p pour choisir, Ctrl+y pour valider, Ctrl+e pour fermer. Pour la déclencher à la main : Ctrl+x Ctrl+o.
Commande
Effet
:checkhealth vim.lsp
quel serveur est actif sur ce fichier, lesquels sont configurés
:lsp restart
redémarrer le serveur (s’il s’est perdu)
:Mason
fenêtre de Mason : i installer, u mettre à jour, X désinstaller, g? aide
Projet Python avec environnement virtuel (ex. ton bot Discord)
Active le venv avant de lancer Neovim, pour que pyright trouve les bibliothèques installées :
cd ~/discord-botsource .venv/bin/activate # adapte au nom de ton dossier venvnvim bot.py
SUDO_EDITOR=nvim sudoedit /etc/hosts # édite une copie avec TON nvim et TA config
sudo nvim lancerait Neovim en root sans ta config (et avec des plugins qui tourneraient en root).
En faire ton éditeur par défaut (git commit, crontab -e, visudo…) : voir 8. Choisir son éditeur par défaut et remplacer nano par nvim.
Synchroniser la config entre Pop!_OS et Arch : mets ~/.config/nvim/ (avec nvim-pack-lock.json) dans un dépôt Git (O04 - Git et GitHub). Sur l’autre système : git clone dans ~/.config/nvim, lance nvim → les mêmes versions des plugins s’installent.
Tester une autre config sans casser la tienne (ex. une config toute faite comme kickstart.nvim) :
NVIM_APPNAME=nvim-test nvim # utilise ~/.config/nvim-test au lieu de ~/.config/nvim
11. Exercices
Exo 1. Installe Neovim 0.12 et vérifie que vim lance bien la nouvelle version.
Correction
cd "$HOME/obsidian/truc non trier/scripts/linux" && ./installer_neovim.shnvim --version | head -1 # NVIM v0.12.xreadlink -f "$(which vim)" # /opt/nvim-linux-x86_64/bin/nvim
Exo 2. Crée init.lua avec seulement la section 1 (options). Vérifie dans Neovim que les numéros de ligne relatifs sont actifs.
Correction
Copier la section 1 dans ~/.config/nvim/init.lua, puis :restart et :set relativenumber? → affiche relativenumber. Le numéro de la ligne du curseur est absolu, les autres comptent la distance (pratique pour 4j, 3dd).
Exo 3. Ajoute un raccourci Espace s qui enregistre et affiche le message « Sauvegardé ! ».
:restart, puis Espace s. Le raccourci apparaît aussi dans which-key (Espace puis attendre).
Exo 4. Dans un fichier Python, renomme une variable utilisée à 3 endroits, en une seule action.
Correction
prix = 10total = prix * 2print(prix, total)
Curseur sur prix → grn → taper tarif → Entrée. Les 3 occurrences changent (et pas un mot prix qui serait dans une chaîne de caractères, contrairement à :%s).
Exo 5. Mets à jour tes plugins en relisant les changements avant de valider.
Correction
:lua vim.pack.update() → un onglet s’ouvre avec les changements de chaque plugin → ]] / [[ pour passer d’un plugin à l’autre → :w pour appliquer (ou :q pour annuler) → :restart.
12. Erreurs fréquentes / dépannage
Problème
Cause
Solution
E5113 ... E474: Invalid argument ou attempt to index field 'pack' (a nil value) au démarrage
Neovim trop ancien (testé : la 0.9.5 d’apt plante dès les options)
nvim --version → installer la 0.12 (partie 2)
E5422: Conflicting configs
init.luaetinit.vim présents
supprimer ~/.config/nvim/init.vim
E492: Not an editor command: Pick
plugin non installé ou setup() non appelé
:messages pour voir l’erreur, vérifier la section 3
Spawning language server ... failed / rien n’est souligné
serveur pas installé
:Mason ou :MasonInstall pyright ; vérifier avec :checkhealth vim.lsp