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