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 ligneset 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