O10 - Vim : l’éditeur modal présent partout

Objectif

Ouvrir, modifier, enregistrer et quitter un fichier avec Vim sans paniquer, puis aller plus loin : se déplacer vite, copier/coller, rechercher-remplacer (même syntaxe que sed), configurer ~/.vimrc.

Pour débuter, O11 - Nano suffit

Le cours de Thierry utilise Vim, mais pour éditer un fichier de config au quotidien, nano est plus simple. Vim reste indispensable à connaître : sur beaucoup de serveurs et de VM minimales, vi est le seul éditeur installé.


1. C’est quoi Vim ?

NomCe que c’est
viL’éditeur historique d’UNIX (Bill Joy, 1976). Présent sur quasiment tous les systèmes.
vimVi IMproved (Bram Moolenaar, 1988, sur Amiga). La version moderne de vi.
vim-tinyVersion minimale de Vim installée par défaut sur Debian/Ubuntu (pas de coloration, comportement proche du vieux vi).
nvimNeovim : un « fork » moderne de Vim, mêmes touches, config à un autre endroit.

Sur ton Pop!_OS, vim lance en fait Neovim

Vérifié sur ton poste : /usr/bin/vim et /usr/bin/vi pointent vers nvim (Neovim 0.9.5). Les touches sont identiques, mais Neovim ne lit pas ~/.vimrc → ta config (set nu, syntax on, colo koehler) n’est pas appliquée. Solution en partie 7.

readlink -f /usr/bin/vim     # affiche /usr/bin/nvim → c'est Neovim

2. La seule idée à comprendre : les modes

Dans Vim, le clavier ne tape pas forcément du texte. Selon le mode, une touche est soit une lettre, soit un ordre (d = supprimer, y = copier…).

flowchart LR
  N["Mode NORMAL<br/>(on se déplace,<br/>on donne des ordres)"] -->|"i, a, o"| I["Mode INSERTION<br/>(on tape du texte)"]
  I -->|"Échap"| N
  N -->|"v, V, Ctrl+v"| V["Mode VISUEL<br/>(on sélectionne)"]
  V -->|"Échap"| N
  N -->|"deux-points :"| C["Ligne de COMMANDE<br/>(:w  :q  :%s...)"]
  C -->|"Entrée ou Échap"| N
ModeComment on y entreCe qu’on voit en basSert à
NormalÉchap (au démarrage, on y est déjà)riense déplacer, couper, copier, coller
Insertioni, a, o…-- INSERT -- / -- INSERTION --taper du texte
Visuelv, V, Ctrl+v-- VISUAL --sélectionner un morceau
Commande:: et le curseur en basenregistrer, quitter, remplacer…

Règle d'or

Perdu ? Appuie 2 fois sur Échap → tu es en mode Normal, à coup sûr. Ensuite seulement, tape ta commande.


3. Le kit de survie (à savoir par cœur)

vim fichier.txt                      # ouvrir (ou créer) un fichier
sudo vim /etc/hosts                  # fichier système → avec sudo (mieux : sudoedit, voir partie 8)
vim +25 script.sh                    # ouvrir directement à la ligne 25
  1. vim fichier.txt   → tu es en mode NORMAL
  2. i                 → mode INSERTION, tu tapes ton texte
  3. Échap             → retour en mode NORMAL
  4. :wq puis Entrée   → enregistrer et quitter
Commande (mode Normal)Effet
:wEnregistrer (write)
:qQuitter (refuse s’il y a des modifs non enregistrées)
:wq · :x · ZZEnregistrer et quitter
:q!Quitter sans enregistrer (on jette les modifs)
:w nouveau.txtEnregistrer sous un autre nom
:e autre.txtOuvrir un autre fichier

4. Entrer en mode insertion

ToucheOù on commence à écrire
iavant le curseur (insert)
aaprès le curseur (append)
Iau début de la ligne
Aà la fin de la ligne
onouvelle ligne en dessous
Onouvelle ligne au-dessus

5. Se déplacer (mode Normal)

            k ↑
     h ←          → l          (les flèches marchent aussi)
            j ↓
ToucheDéplacement
h j k lgauche, bas, haut, droite
w / b / emot suivant / mot précédent / fin du mot
0 / ^ / $début de ligne / 1er caractère non vide / fin de ligne
gg / Gdébut / fin du fichier
160G ou :160aller à la ligne 160
Ctrl+d / Ctrl+udescendre / monter d’une demi-page
%sauter à la parenthèse/accolade correspondante (pratique dans un script)

Les nombres multiplient les commandes

5j = descendre de 5 lignes · 3dd = couper 3 lignes · 2w = avancer de 2 mots.


6. Modifier le texte (mode Normal)

6.1 Couper, copier, coller

Dans Vim, « supprimer » = couper : ce qui est supprimé peut être recollé avec p.

ToucheEffet
xsupprimer le caractère sous le curseur
ddcouper la ligne
dwcouper jusqu’à la fin du mot
D (= d$)couper jusqu’à la fin de la ligne
yycopier la ligne (yank)
ywcopier un mot
p / Pcoller après / avant le curseur
r + lettreremplacer un caractère
cwchanger le mot (le supprime et passe en insertion)
ccchanger toute la ligne
Jcoller la ligne suivante au bout de la ligne actuelle
>> / <<indenter / désindenter la ligne

6.2 Annuler, refaire, répéter

ToucheEffet
uannuler (undo)
Ctrl+rrefaire (redo)
.répéter la dernière modification (super pratique)

6.3 Le mode Visuel (sélectionner)

ToucheSélection
vcaractère par caractère
Vlignes entières
Ctrl+vbloc (colonne)

Puis : y copier · d couper · > / < indenter · : lancer une commande sur la sélection.

Commenter 5 lignes d'un script Bash d'un coup

Ctrl+v → 4j (sélectionne 5 lignes en colonne) → I (i majuscule) → tape # → Échap. Le # apparaît sur les 5 lignes.


7. Configurer ~/.vimrc (et Neovim)

7.1 Une bonne config de départ

Ton ~/.vimrc actuel contient déjà set nu, syntax on, colo koehler. Version enrichie :

" ~/.vimrc — les commentaires commencent par un guillemet
set number              " numéros de ligne (= set nu)
syntax on               " coloration syntaxique
colorscheme koehler     " thème sombre (= colo koehler)
set mouse=a             " la souris marche (clic, molette, sélection)
set hlsearch            " surligne les résultats de recherche
set incsearch           " cherche pendant qu'on tape
set ignorecase          " recherche sans tenir compte des majuscules...
set smartcase           " ...sauf si on tape une majuscule
set autoindent          " garde l'indentation de la ligne précédente
set tabstop=4           " une tabulation = 4 espaces à l'affichage
set shiftwidth=4        " >> et << décalent de 4
set expandtab           " Tab insère des espaces (indispensable en Python/YAML)
set cursorline          " surligne la ligne du curseur

7.2 Faire lire ce fichier par Neovim (ton cas sur Pop!_OS)

Neovim lit ~/.config/nvim/init.vim, pas ~/.vimrc. Le plus simple : lui dire de charger ton .vimrc.

mkdir -p ~/.config/nvim                              # crée le dossier de config de Neovim
echo 'source ~/.vimrc' > ~/.config/nvim/init.vim     # init.vim charge ton .vimrc

Tu veux garder Neovim et le configurer vraiment (Lua, plugins, LSP) ?

Tout est dans O12 - Neovim (attention : la version apt de Pop!_OS, 0.9.5, est trop ancienne pour cette config).

Autre solution : installer le « vrai » Vim

sudo apt install vim (Pop!_OS) · sudo pacman -S vim (Arch). Ensuite sudo update-alternatives --config vim permet de choisir entre Vim et Neovim.


8. Rechercher et remplacer

8.1 Rechercher

CommandeEffet
/motif puis Entréechercher vers le bas
?motif puis Entréechercher vers le haut
n / Nrésultat suivant / précédent
*chercher le mot sous le curseur
:nohenlever le surlignage

8.2 Remplacer : :s - même syntaxe que sed

:%s/ancien/nouveau/gc
 │ │  │      │     ││
 │ │  │      │     │└─ c = confirmer chaque remplacement (y/n)
 │ │  │      │     └── g = toutes les occurrences de la ligne
 │ │  │      └──────── texte de remplacement
 │ │  └─────────────── texte (ou regex) cherché
 │ └────────────────── s = substitution
 └──────────────────── % = tout le fichier
CommandeEffet
:s/a/b/1re occurrence de la ligne actuelle
:s/a/b/gtoutes les occurrences de la ligne
:%s/a/b/gtout le fichier
:%s/a/b/gctout le fichier, avec confirmation
:%s/a/b/gitout le fichier, sans tenir compte de la casse
:10,20s/a/b/gseulement les lignes 10 à 20
:%s#/var/www/html#/var/www/wordpress#gséparateur # quand le texte contient des /

Lien avec le TP déploiement

C’est exactement la logique du sed -i 's#...#...#' du TP : le cours montre le changement de séparateur dans la partie Vim, et on l’a réutilisé dans sed → TP deploiement - explications. Regex détaillées : Récap - administration Linux shell.


9. Utile en admin système

CommandeEffet
:!ls -llancer une commande shell sans quitter Vim
:r fichierinsérer le contenu d’un fichier sous le curseur
:r !dateinsérer le résultat d’une commande
:set paste puis :set nopastecoller du texte venant d’ailleurs sans casser l’indentation (Vim ; inutile dans Neovim)
:sp fichier / :vs fichierdécouper l’écran (horizontal / vertical) - Ctrl+w w pour changer
:set nu!afficher / cacher les numéros de ligne

Éditer un fichier système proprement : sudoedit

sudoedit /etc/ssh/sshd_config        # = sudo -e : copie le fichier, tu l'édites avec TON éditeur et TA config
SUDO_EDITOR=vim sudoedit /etc/hosts  # forcer Vim pour cette fois

L'astuce :w !sudo tee % ne marche pas dans Neovim

Elle sert à enregistrer un fichier ouvert sans sudo. Dans Neovim, sudo ne peut pas demander le mot de passe → échec. Réflexe : :q!, puis rouvrir avec sudoedit.

Où Vim (ou nano) s’ouvre tout seul : git commit sans -m, crontab -e, sudo visudo (L03 - Utilisateurs, groupes et droits), systemctl edit. L’éditeur utilisé dépend de la variable EDITOR → voir 8. Choisir son éditeur par défaut.


10. Pour s’entraîner

vimtutor            # tutoriel interactif de 30 min (en français si la langue du système l'est)

Dans Neovim : taper :Tutor puis Entrée.

Exercices

Exo 1. Crée ~/test-vim.txt, écris 3 lignes (un, deux, trois), enregistre et quitte.

Exo 2. Rouvre le fichier, déplace la ligne un tout en bas, puis annule.

Exo 3. Dans une copie de /etc/ssh/sshd_config, remplace toutes les occurrences de yes par no, en confirmant une par une, puis quitte sans enregistrer.

Exo 4. Va à la ligne 10, copie 3 lignes et colle-les à la fin du fichier.


11. Erreurs fréquentes / dépannage

ProblèmeCauseSolution
« Je n’arrive pas à quitter »tu es en mode InsertionÉchap Échap puis :q!
Les lettres tapées font des choses bizarrestu es en mode Normali pour passer en insertion
E37: No write since last changemodifs non enregistrées:wq (garder) ou :q! (jeter)
E45: 'readonly' option is set / E212: Can't open file for writingpas les droits:q! puis sudoedit fichier
E325: ATTENTION + fichier .swpVim a planté ou le fichier est déjà ouvert ailleursR récupère, D supprime le .swp (si personne d’autre ne l’édite), Q quitte
recording @q en bastu as appuyé sur q (enregistrement de macro)appuie encore sur q
Écran figéCtrl+s a bloqué le terminalCtrl+q débloque
Les flèches écrivent A B C D (VM Debian)c’est vim-tinysudo apt install vim (c’est l’exemple install_vim du TP)
Ma config ~/.vimrc est ignoréevim = Neovim sur ton postepartie 7.2

12. Antisèche

Je veux…Touche
écrirei (puis Échap)
enregistrer + quitter:wq
quitter sans enregistrer:q!
annuler / refaireu / Ctrl+r
couper / copier / coller une lignedd / yy / p
chercher/mot puis n
remplacer partout:%s/ancien/nouveau/g
aller ligne N / début / fin:N / gg / G

Voir aussi