Vim

Utilisation basique

Se déplacer dans un document

<flèches directionnelles>   déplacement selon les flèches
w                           aller au prochain mot
b                           aller au début du mot (et des mots précédents)
e                           aller à la fin du mot (et des mots suivants)
^                           aller au début de la ligne
$ (ou 0)                    aller à la fin de la ligne
gg                          aller au début du document
G                           aller à la fin du document
:X                          aller à la ligne X (où X est un nombre)
(                           aller au début de la phrase
)                           aller à la fin de la phrase
{                           aller au début du paragraphe
}                           aller à la fin du paragraphe
ctrl-f                      faire défiler le document d'une page (écran) vers le bas
ctrl-b                      faire défiler le document d'une page vers le haut
ctrl-e                      faire défiler le document d'une ligne vers le bas
ctrl-y                      faire défiler le document d'une ligne vers le haut

Éditer un document en mode “insertion”

a                        commence l'insertion après le curseur
A                        commence l'insertion à la fin de la ligne
C                        supprime le reste de la ligne à partir du curseur et passe en mode insertion
e                        commence l'insertion après le mot
i (ou touche <Insert>)   commence l'insertion depuis le curseur
I                        commence l'insertion depuis le début de la ligne
o                        commence l'insertion à la ligne suivante
O                        commence l'insertion à la ligne précédente
s                        commence l'insertion en effaçant le caractère sous le curseur
S                        commence l'insertion en effaçant la ligne entière
<Echap>                  quitter le mode édition

Manipulation de texte

v           passer en mode sélection "visuelle" (touche <Echap> pour en sortir)
V           passer en mode sélection "visuelle" par ligne
ctrl-v      passer en mode sélection "visuelle" par bloc
dd          couper la ligne entière
dX          couper la ligne ainsi que les X prochaines (où X est un nombre)
D           couper à partir du curseur
yy (ou Y)   copier la ligne
yX          copier la ligne ainsi que les X prochaines (où X est un nombre)
p           coller après le curseur
P           coller avant la ligne
rX          substitue le caractère sous le curseur par X

Annuler/rejouer une action

u        annuler
ctrl-r   rejouer

Sauvegarder/quitter

:w   sauvegarder (:w! pour forcer la sauvegarde si avertissement)
:q   quitter Vim (:q! pour quitter sans sauvegarder)
:x   quitter en sauvegardant (équivaut à :wq)

Utilisation avancée

Regexps

Quelques petites subtilités dans l’utilisation d’expressions rationnelles (“regexps”) dans Vim : les caractères énonçant des alternatives (par exemple (ceci|cela)) doivent être échappés à l’aide d’un “antislash”.

:%s/tout \\(ceci\\|cela\\) pour ça/tout ça pour ça/

Gestion des buffers

Dans Vim, les “buffers” sont assimilables à des fichiers en cours d’édition dans une seule instance de Vim. Voici comment les utiliser au mieux :

:e       ouvrir un fichier dans un nouveau buffer
:ls      lister les buffers
:bn      aller au buffer suivant
:bp      revenir au buffer précédent
:bd      détruire le buffer courant (= à clore le fichier)
:bX      aller au buffer X (où X est un nombre entier, cf. :ls pour les identifiants des buffers existants)
ctrl+^   intervertir le buffer courant avec le précédent

Viewports (sous-fenêtrage)

Vim vous permet également de subdiviser la fenêtre principale en sous-fenêtres — appellées “viewports” — affichant chacune un buffer individuel, vous permettant ainsi de visualiser plusieurs fichiers d’un coup plutôt que d’avoir à naviguer entre plusieurs buffers. Pour diviser la fenêtre principale — qui est d’ailleurs elle-même un viewport — horizontalement, tapez le séquence <ctrl-w> n ou :split (le buffer actuellement affiché dans le nouveau viewport est celui qui était affiché dans le buffer courant) ; pour la diviser verticalement, tapez la séquence <ctrl-w> v, ou encore :vsplit.

Créer un nouveau viewport ne vous place pas dedans automatiquement : pour passer d’un viewport à un autre, tapez la séquence <ctrl-w><ctrl-w>. Pour fermer le viewport courant, tapez la séquence <ctrl-w> d (note : ceci ne fait que fermer le “viewport”, pas le “buffer” qui y était affiché).

Créer des raccourcis clavier

Outre les nombreux raccourcis claviers (““bindkeys”") disponibles de base dans Vim, il est possible de définir (““map”") des “bindkeys” personnalisés ou encore de modifier les actuels à l’aide de la commande map. Exemple pour illustrer le propos : n’utilisant personnellement pas les raccourcis clavier <ctrl-n> et <ctrl-p> — permettant de déplacer le curseur respectivement à la ligne suivante et à la ligne précédente —, je les ai redéfinis comme ceci :

:map <C-n> :bn<CR>
:map <C-p> :bp<CR>

Désormais, <ctrl-n> est un raccourci vers la commande :bn — qui, comme vue ci-dessus, permet d’aller au “buffer” suivant —, <ctrl-p> vers la commande :bp ; la séquence <CR> correspond à un “retour charriot” (“carriage return” en anglais) et permet donc d’exécuter directement la commande définie dans la directive de “mapping” sans avoir besoin de taper sur la touche <Enter>.

Trucs & astuces

Afficher l’état du document

Cette commande affiche quelques informations utile sur le document actuellement ouvert : nom, nombre de lignes et positionnement du curseur dans le document.

ctrl-g

Ouvrir plusieurs documents simultanément et passer de l’un à l’autre

Ouvrir plusieurs fichiers en même temps :

$ vim fichier1 fichier2 fichier3

Pour passer de l’un à l’autre en descendant :

:n

Pour passer de l’un à l’autre en remontant :

:N

Activer la coloration syntaxique

:syn on
:set background=dark    (si terminal sur fond sombre)

Insérer le contenu d’un fichier dans le document (où est un nom de fichier)

:r <fichier>

Insérer la sortie d’affichage d’un programme externe dans le document (où est une commande shell)

!!<cmd>

Moduler le contenu du document à travers un programme externe (où est une commande shell)

:%!<cmd>

Incrémenter/décrémenter un nombre (ou )

ctrl-a      (incrémente)
ctrl-x      (décrémente)

Complétion sur un mot ou une ligne (si le mot existe déjà dans le document)

En mode insertion :

ctrl-p             (sur un mot : autocomplète le mot, ou affiche une liste des complétions possibles)
ctrl-x ctrl-l      (sur une ligne : autocomplète la ligne courante si une ligne similaire existe)

Effacer les espaces/tabulations devant une ligne

dw (en début de ligne)

Aller à la prochaine occurrence de

*      (sur le mot ; recherche descendante)
#      (recherche ascendante)

Passer toute une ligne en minuscules/majuscules

guu      passer la ligne en lettres minuscules
gUU      passer la ligne en lettres majuscules

Aller-venir entre les parenthèses/crochets/accolades

%      (sur le crochet/accolade/parenthèse)

Désactiver l’auto-indentation le temps d’un copier/coller

:set paste      (collez votre texte, puis ":set nopaste" pour réactiver l'auto-indentation)

Recherche dans un document

/<mot>      (recherche descendante)
?<mot>      (recherche ascendante)

Par défaut la recherche est sensible à la casse, pour lancer une recherche insensible à la casse, il faut précéder <mot> par \c :

/\c<mot>      (recherche descendante)
?\c<mot>      (recherche ascendante)

Il est possible de paramétrer définitivement Vim pour que les recherches ne soient pas sensibles à la casse, en ajoutant la directive suivante dans votre .vimrc :

set ignorecase
set hlsearch      (pour mettre surbrillance les résultats de la recherche)

Remplacement d’un motif dans le document

:%s/regexp/remplacement/g      ("/gc" pour demander confirmation à chaque remplacement)

Il est possible de concentrer cette opération sur un intervalle de lignes :

:10,20s/regexp/remplacement/g      (n'effectue la substitution que des lignes 10 à 20 inclues)

Insertion d’une chaîne de caractères dans ou devant un bloc de texte

Sélectionnez le bloc de texte concerné en mode “visuel en bloc” (ctrl+v), puis :

I      (tapez ensuite votre chaîne de caractère ou simple caractère, par exemple "#" pour commenter tout un bloc)
<Echap>

Marquer un endroit dans le document (où X est une lettre)

mX      (poser une marque)
`X      (revenir à la marque)

Numéroter les lignes

:set number
:set nonumber      (pour désactiver l'affichage)

Indenter plusieurs lignes d’un seul coup

==       sur une ligne seule, ou
=        sur un ensemble de lignes sélectionnées en mode visuel

N>>      (où N est un entier ; par exemple "5>>" indente 5 lignes à partir du curseur)

Extraire un ensemble de lignes dans un nouveau fichier

:1,10w nouveau_fichier.txt      (ici, copie de la ligne 1 à la ligne 10 dans le fichier nouveau_fichier.txt)

Visualiser les caractères spéciaux (tabulations, fins de lignes etc.)

:set list

Se débarrasser des ^M en fin de ligne

:%s/\r//g

Supprimer toutes les lignes contenant un certain motif

:g/regexp/d

Ainsi, il est par exemple possible de supprimer toutes les lignes commentées dans un fichier de configuration (:g/^#/d si le caractère de commentaires est “#").

Compiler un code source C sans quitter Vim

:set makeprg=gcc\ -o\ %<\ %      (générera un exécutable nommé d'après le fichier source sans le suffixe .c)

Retourner au dernier endroit modifié du fichier

’.    déplace le curseur au début de ligne où la dernière modification a eu lieu
`.    positionne le curseur sur l'emplacement exact de la dernière modification

Effectuer des opérations mathématiques à la volée (en mode insertion)

<ctrl-r>=24*24      (insère 576 sous le curseur)

Ouvrir dans Vim un fichier dont le chemin/nom est dans le buffer actuel

gf      (ouvre le fichier dont le nom est écrit sous le curseur)

Ouvrir dans Vim un fichier à une ligne spécifique

$ vim un_fichier.txt +15

Cette ligne de commande ouvrira dans Vim le fichier un_fichier.txt et positionnera le curseur à la ligne 15.

Remplacer du texte depuis le curseur jusqu’à un emplacement spécifique dans une ligne

cw      remplace le texte depuis le curseur jusqu'à la fin du mot courant
c/      remplace le texte depuis le curseur jusqu'à la première occurrence de la chaîne recherchée

Enregistrer un fichier pour lequel vous n’avez pas le droit d’écriture

Un grand classique : ouvrir un fichier en édition en oubliant de passer en root ou bien d’utiliser sudo. Plutôt que de refermer le fichier sans valider les modifications, le rouvrir avec les bons droits et enfin de refaire toutes les modifications, il est possible d’enregistrer tout de même le fichier pour peu que vous disposiez des droits via sudo :

:w !sudo tee %

Masquer les commentaires dans un fichier

Certains fichiers de configuration de logiciels peuvent être très généreux en explications au travers de commentaires pour leurs directives, si bien qu’il est parfois difficile de les lire efficacement. Vim dispose d’une fonctionnalité nommée “folds” (“plis”) qui permet de masquer des portions de texte dans le buffer en cours d’édition (sans modifier réellement le fichier), et typiquement nous pouvons utiliser cette fonctionnalité pour masquer tous les commentaires d’un fichier de configuration et ne garder affichées que les lignes réellement pertinentes :

:set fdm=expr
:set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0

Pour “déplier” temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère “#"), placez votre curseur sur le pli correspondant au bloc compacté et tapez zo (ou pressez simplement <espace>), et zm pour le replier. Si vous avez déplié plusieurs blocs, vous pouvez tous les replier d’un coup avec zM ; à l’inverse, vous pouvez déplier tous les blocs d’un seul coup avec zi.

Il est possible de plier n’importe quel bloc de texte sélectionné en mode visuel
une fois sélectionné, tapez zf.

Source : Erik Rossen. Plus d’informations : Vim tips: Folding fun sur linux.com.

Éditer un fichier sur une machine distante

Vim est tellement surpuissant qu’il est possible d’éditer via SSH des fichiers localisés sur une machine distante avec le vim local à votre poste de travail. Pour ce faire, il faut l’ouvrir en utilisant la syntaxe suivante :

$ vim scp://[email protected]//home/marc/monfichier.txt

ℹ️ Attention à la subtilité, il y a deux / : un séparant le nom de la machine distante du chemin vers le fichier, et un autre désignant la racine du système de fichier distant si vous spécifiez un chemin absolu.

Embarquer des préférences de Vim spécifiques dans un document

Fonctionnalité intéressante de Vim, il est possible de consigner des directives de configuration telles que vous venez d’en voir directement dans un document, de manière à ce que ces dernières soient appliquées automatiquement lorsque ledit fichier est chargé dans l’éditeur. Dans un premier temps, il faut activer la détection de ces directives embarquées à en spécifiant la directive suivante dans votre /etc/vimrc ou .vimrc :

set modeline

Il suffit ensuite de lister sur une ligne commentée selon le langage de programmation si il s’agit de code ou d’un fichier de configuration, ou préfixée d’un signe # en cas de texte. Voici un exemple dans un script Python :

#!/usr/bin/python
# -*- Coding: utf-8 -*-
# vim: tabstop=4 fileencoding=utf-8

def hw():
    print('hello world!')

hw()

La directives spécifiées sur la troisième ligne de ce script indique à Vim qu’au sein de ce document il doit formater les tabulations avec 4 caractères d’espace et que l’encodage de ce document est l’UTF-8 ; la ligne doit impérativement commencer, après le signe de commentaire, par une espace suivie de vim: puis encore une espace.

Retourner rapidement au dernier emplacement avant un saut dans un fichier

Utiliser deux fois le caractère ` (backtick) vous ramènera où vous étiez avant de faire une recherche ou un saut à un endroit spécifique dans le fichier ouvert.

Ouvrir un fichier dont le chemin est présent dans le fichier courant

Si le chemin d’un fichier est renseigné dans le fichier courant, il est possible de l’ouvrir directement depuis celui-ci, tapez simplement gf. Pour revenir au fichier principal utilisez ensuite <Ctrl> + o.

Effacer une ligne sans perdre le contenu précédemment copié

Vous avez déjà probablement pesté contre Vim lorsque vous avez placé une ligne en mémoire en vue de la coller plus tard, mais l’avez perdue entre temps pour avoir effacé une autre ligne avec la séquence dd. Il existe une parade qui permet d’effacer des lignes sans garder leur contenu en mémoire (et donc perdre le contenu de la précédente) en utilisant la séquence suivante :

"_dd

Effacer rapidement du contenu placé entre guillemets, parenthèses, accolades…

Lorsque vous êtes placé entre deux caractères tels que des guillemets, parenthèses ou encore accolades, taper la séquence ciX — où X est le dernier caractère bornant la zone, par exemple “}” — effacera tous le contenu compris entre ces guillemets/parenthèses/accolades et vous placera en mode “insertion”. Note : cela fonctionne même sur plusieurs lignes.

Centrer le document sur la ligne actuelle

Taper la séquence zt redessine l’affichage du document en plaçant la ligne actuelle en haut de la fenêtre ; une variante avec zz fait de même en plaçant la ligne actuelle au centre de la fenêtre.

Forcer un encodage de caractères lors de l’enregistrement d’un fichier

Pour enregistrer un fichier avec un encodage spécifique, spécifiez le paramètre ++enc=<encodage> à la commande d’enregistrement :w. Exemple pour forcer l’encodage UTF-8 :

:w ++enc=utf-8

Forcer le reformatage du paragraphe courant au-delà d’un nombre de colonnes

Par défaut Vim ne force pas le retour à la ligne lors d’une saisie de texte libre. Pour reformater votre paragraphe en cours de manière à ce que ses lignes ne dépassent pas un certain nombre de caractères, tapez la séquence gq ; pour ajuster la limite de colonnes au-delà de laquelle forcer un retour à la ligne, définissez le paramètre textwith avec la séquence set textwith=<nombre de colonnes>, par exemple set textwith=100 (la valeur par défaut de ce paramètre est 80).

Il est possible d’appliquer ce reformatage sur l’intégralité du buffer courant de deux manières : soit en plaçant le curseur au début du buffer et en tapant la séquence gqG (applique jusqu’à la fin du buffer), soit en plaçant le curseur à la fin du buffer et en tapant la séquence gqgg (applique jusqu’au début du buffer).

Supprimer toutes les balises HTML d’un document

Petit one-liner pratique pour supprimer toutes les balises HTML d’un document à l’aide d’une commande de substitution. Petite subtilité dans l’expression rationnelle : il ne faut pas écrire .* car étant trop greedy elle supprimerait également ce qui est contenu entre les balises, mais plutôt .\{-}.

:%s/<.\{-}>//gc