logo rss

Les éditeurs de texte Vi et Vim

Vi est et reste un cauchemar pour la plupart des étudiants qui s'y sont essayés...

J'en profite pour placer une blague qui n'est pas de moi, donc très drôle :
Q: Comment générer une chaine aléatoire?
R: Prenez un stagiaire/étudiant, mettez le devant un vi(m) et demandez lui de quitter!

Pourtant quand on décide de s'y mettre on s'aperçoit que c'est un outil redoutablement puissant et même mieux : vraiment très pratique (d'ailleurs c'est avec lui que j'écris ce paragraphe ). Pourquoi Vi et pourquoi Vim? Vi est l'éditeur historique du monde Unix et est souvent installé par défaut sur les distributions actuelles. Il est donc fortement recommandé d'en connaitre les bases, pour sa culture perso ou pour être prêt le jour ou vous vous retrouverez devant un serveur Linux sans interface graphique, à devoir éditer un fichier de configuration (si si vous verrez ça vous arrivera! ). On peut dire que Vim est un cousin de Vi dont il est ouvertement (haha elle est très drôle celle la, si tu la comprends félicitation tu es officiellement un geek ) inspiré, et s'affiche même comme lui étant plus évolué Vim=Vi IMprovevd. C'est personnellement lui que j'utilise car je le trouve (entres autres) plus facile d'accès et moins capricieux.

Préambule

Fichier de configuration de vim :

Les fichiers de configuration de Vim se trouvent à deux endroits :

  • Un fichier global (pour tout les utilisateurs) dans /etc :
/etc/vimrc
  • Et un dans le répertoire spécifique aux utilisateurs :
~/.vimrc

ou

/home/USER/.vimrc

C'est dans ce fichier que l'on pourra insérer par exemple syntax on, pour activer la syntaxe (permet de mettre de la couleur sur les fichiers contenant du code).

Ouvrir un fichier :

vim fichier

Ouvre deux, trois ou quatre versions d'un fichier dans Vim et affiche leurs différences :

vimdiff fichier1 fichier2 … 

Ouvrir un fichier dans deux moitiés horizontales :

vim -o fichier1 fichier2

Ouvrir un fichier dans deux moitiés verticales :

vim -O fichier1 fichier2

Ouvrir un fichier et aller directement à la ligne n°X:

vim +X fichier1

Quelques commandes vi

Commandes pour déplacer le curseur ou l'affichage
h Déplacer le curseur vers la gauche.
j Déplacer le curseur vers le bas.
k Déplacer le curseur vers le haut.
l Déplacer le curseur vers la droite.
b "Back" déplacer le curseur d'un mot vers la gauche.
B "Back" pareil que b mais ne s'arretera pas à un point, virgule ou autres...
v "Visual" passer en mode visuel.
V "Visual" passer en mode visuel ligne.
Ctrl+v "Visual" passer en mode visuel bloc (séclection d'un cadre de texte).
gv Re-sélectionner en "visual" (aprés une opération réalisée).
w "Word" déplacer le curseur d'un mot vers la droite.
W "Word" pareil que w mais ne s'arretera pas à un point, virgule ou autres...
G Déplacer le curseur à la dernière ligne du document.
Ctrl+f Se déplacer d'un écran vers le bas.
Ctrl+b Se déplacer d'un écran vers le haut.
$ Déplacer le curseur à la fin de la ligne.
0 Déplacer le curseur en début de ligne.
^ Déplacer le curseur sur le premier caractère de la ligne courante.
{ Déplacer le curseur vers le prochain paragraphe.
} Déplacer le curseur vers le paragraphe précédent.
Commandes pour l'édition
dd Couper la ligne.
dw Couper "Word" un mot.
dl Couper "Letter" un caractère.
x Couper un caractère.
X Couper un caractère à gauche.
yy Copier la ligne courante.
yl Copier "Letter" un caractère.
yw Copier "Word" un mot.
D Coupe du curseur jusqu'à la fin de la ligne.
p Colle aprés le curseur.
P Colle avant le curseur.
u Annule la commande précédente.
Ctrl+r Restaure une commande précédement annulée.
ZZ Sauvegarde et quitte.
Mode Texte
. Répéter la dernière édition.
a "Add" passe en mode insertion un caractère aprés le curseur.
A "Add" passe en mode insertion à la fin de la ligne courante.
i "Insert" passe en mode insertion au niveau du curseur.
I "Insert" passe en mode insertion au niveau du premier caractère non blanc de la ligne courante.
J "Join", joindre deux lignes.
o Passe en mode insertion 1 ligne en dessous du curseur.
O Passe en mode insertion 1 ligne au dessous du curseur.
r "Replace" remplace le caractère par le prochain caractère entré.
R "Replace" passe en mode Remplacement, chaque nouveau caractère écrit remplace le caractère existant. Esc pour revenir en mode commande.
cl "Cut Letter" coupe un caractère.
ct+ Coupe jusqu'au caractère +.
cw "Cut Word" coupe du curseur jusqu'au prochain mot cad : espace, virgule, point etc...
cW "Cut Word" coupe du curseur jusqu'au prochain espace.
C "Cut", Coupe du curseur jusqu'à la fin de la ligne et passe en mode Insertion.
xp Permutter deux caractères.
<ESC> Sortir du mode TEXT-INPUT.
ctrl+ ou ctrl+a Incrémenter un nombre (s'applique au prochain sur la ligne).
ctrl- ou ctrl+x Décrémenter un nombre (s'applique au prochain sur la ligne).
ctrl+R "Redo" rejouer la commande annulée.
~ Modifier la casse du caractère courant.
guu ou vu Mettre la ligne en minuscule.
gUU ou vU Mettre la ligne en majuscule.
veu Mettre le mot en minuscule.
vEU Mettre le mot en majuscule.
gqap ou vapgq Justifier le paragraphe courant.
Mode Commande
:w "Write" Enregistre le fichier.
:w file "Write" Enregistre le fichier avec comme nom file dans le dossier courant.
:q "Quit" Sort de vi si le fichier n'a pas été modifié.
:q! "Quit" Sort de vi même si le fichier n'a pas été modifié.
:wq "Write and Quit" Enregistre et Sort de vi même si le fichier n'a pas été modifié.
:x Enregistre si modification et Sort de vi si le fichier a été modifié.
:n Aller à la ligne "n".
:!foo Exécute la commande externe foo.
:chdir ou :!chdir Change de répertoire courant.
:open ou :e file "Edit" Editer le fichier "file".
:e ++enc=latin1 Ré-ouvrir le fichier avec un encodage différent.
:set fileformat? Affiche le format d'encodage courant.
:e ++ff=dos Ré-ouvrir le fichier avec un format différent.
/word Recherche le mot word dans le sens haut vers le bas du document courant. (on utilisera la touche n pour aller vers le mot suivant et N pour aller vers le mot précédent).
?word Recherche le mot word dans le sens bas vers le haut du document courant. (on utilisera la touche n pour aller vers le mot suivant et N pour aller vers le mot précédent).
:$ Déplace le curseur vers la dernière ligne du document.
:syntax on Active la syntaxe, permet de mettre de la couleur dans les fichiers de conf et dans les fichiers contenant du code.
:set nu(mber) Active l'affichage des numéros de ligne.
:set nonu Désactive l'affichage des numéros de ligne.
:set list Affiche les caractères cachés (set nolist pour désactiver).
Completion
Ctrl+n Completion du mot (répéter la commande pour dérouler vers le bas).
Ctrl+p Completion du mot (répéter la commande pour dérouler vers le haut).
Ctrl+r puis =x+n Insère le résultat arythmétique x+n.
Ctrl+r puis % Insère le nom et le chemin du fichier courant.
Ctrl+r puis / Insère ce qui se trouve dans le buffer de recherche.
Mode Multi Fenètre
Ctrl+w Action
w Changer de fenètre.
n Créer une fenètre.
+ ou - Agrandir/Diminuer (d'une ligne) la fenètre courante.
x Permuter deux fenètres.
q Fermer la fenètre active.
h ou j ou k ou l Déplacer le curseur dans une fenètre.
:sp Séparer un même fichier en deux fenètres (Action+q pour revenir à une fenètre).
Easter Eggs
:help! Pas de panique!
:help holy-grail You found it, Arthur!
:help 42 Référence à H2G2.
:help UserGettingBored When the user hits CTRL-C. Just kidding! :-)
:Ni! Do you demand a shrubbery?

Exemples

  • Supprimer les espaces vides en fin de ligne :
:%s/\s\+$//g
  • Remplacer les 12 prochains caractères de fin de ligne (symbolisés par le caractère $) par le texte </br> :
:s/$/<\/br>/12
  • Remplacer check_command check_kav1!serv01,4,5,6 par check_command check_kav1!serv01 1 3 5 /home/ pour les lignes 10 à 50 et seulement celles contenant le motif check_command :
:10,50g/check_command/s/\(.*\!\w*\).*/\1 1\ 3\ 5\ \/home\/

Explications :

  • 10,50 : permet de ne traiter que les lignes de 10 à 50.
  • g/check_command : Seulement les lignes contenant check_command.
  • s/\(.*\!\w*\).*/ : C'est la partie à remplacer. .*\! va dans notre cas matcher check_command check_kav1, \w* équivaut à tous caractères [a-zA-Z0-9] répétés de 1 à plusieurs fois et matchera donc serv01 (car la virgule ne sera pas prise en compte), tous les éléments à l'intérieur de la parenthèse (donc check_command check_kav1) seront enregistrés dans le buffer \1.
  • /\1 1\ 3\ 5\ \/home\/ : C'est la partie qui remplacera la partie matchée. \1 contenu du buffer n°1 (cad check_command check_kav1). 1\ 3\ 5\ \/home\/ correspond à 1 3 5 /home/.
  • Supprimer les lignes vides
:g/^$/d

Autres

Les buffers

Il est possible de stocker du texte dans des buffers ce qui va nous permettre de garder en mémoire plusieurs éléments que l'on pourra coller quand bon nous semble. Pour se faire il va falloir utiliser la combinaison "+une lettre de l'alphabet

  • Exemple pour copier dans le buffer a la ligne courante :
"ayy
  • On colle via le même principe :
"ap

Saut de ligne automatique tout les 72 caractères

echo 'set textwidth=72' >> ~.vimrc

Correcteur d'orthographe

Tout est possible avec Vim, même de mettre en place un correcteur orthographique! Trés utile pour moi!

Pour se faire il faut suivre les instructions suivantes :

  • Editer le fichier .vimrc et ajouter la ligne set spelllang=fr
echo 'set spelllang=fr' >> ~/.vimrc
  • On créer le répertoire spell dans ~/.vim ou /usr/share/vim/vimcurrent/ pour l'ensemble des utilisateurs du système, et on y copie les fichiers suivants :
wget ftp://ftp.vim.org/pub/vim/runtime/spell/fr.latin1.spl
wget ftp://ftp.vim.org/pub/vim/runtime/spell/fr.latin1.sug
wget ftp://ftp.vim.org/pub/vim/runtime/spell/fr.utf-8.spl
wget ftp://ftp.vim.org/pub/vim/runtime/spell/fr.utf-8.sug
  • On active la vérification en tapant :
:set spell

On entrera z= sur les mots surlignés en rouge, pour accéder à une liste de mots proposé par Vim.

Unicode characters

Depuis le mode insertion nous pouvons générer des charactères unicode, exemple ici avec les points de suspension «»

  • Entrer en mode insertion : i
  • Appuyer sur Ctrl+u pour entrer dans le mode unicode
  • Taper 2026 et appuyer sur entrer

Sources

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact