Guide de surVI

Je fais ce billet pour un copain qui veut se mettre à Vim. Pour ceux qui vivent dans une grotte depuis que l’informatique existe, Vim est une version améliorée de Vi un éditeur de texte très puissant qui existe depuis plus de 30 ans ! Il est disponible sur quasiment toutes les plates-formes…

Ce billet regroupe ce que je connais de Vim (sans doute peu de choses par rapport à toutes ses capacités).

Avant tout, Vim peut être configuré pour être un peut plus présentable. Je ne vais pas entrer dans le détail de la configuration, mais je vais plutôt vous donner mon fichier de configuration. Il est très simple. Cela fait des années que je me le trimbale de machine en machine sans y toucher. Ce fichier doit s’appeler .vimrc et se trouver dans votre répertoire personnel.

Je ne me rappel plus bien de l’utilité de chaque ligne. Je me demande même si je l’ai jamais su, j’ai sans doute « piqué » ce fichier sur un site web. Mais de tête :

  • ai : pour auto-increment, laissé vim s’occuper de l’incrementation des fichiers qu’il reconnaît. En général, il ne se trompe pas ;-).
  • ul=100 fixe le nombre d’annulations possible à 100
  • incsearch permet de déplacer le curseur au fur et à mesure que l’on tape le mot que l’on recherche. Très pratique.
  • hlsearch permet de surligner toutes les occurrence de la dernière recherche.

Pour le reste, je ne sais plus, et cela sort un peut du cadre de cet article (c’est moi qui décide 😉 ), référez vous à la documentation pour en savoir plus ;-). Maintenant, passons aux choses sérieuses…

Principes de base :
Vim est un éditeur de texte qui utilise différents modes comme le mode commande, ligne de commande, édition/insertion, ou encore selection.

  • Le mode commande est le mode qui permet d’entrer des commandes pour modifier le texte, l’éditeur, gérer les fichiers, etc. C’est le mode par défaut. Depuis un autre mode, on y accède en appuyant sur Echap.
  • Le mode ligne de commande permet d’entrer les commandes les plus complexes. On y entre en appuyant sur « : ». A partir de ce moment, la commande peut être édité sur la ligne inférieure du terminal. La commande est lancée en tapant ou annulée en appuyant sur <échap>.
  • Le mode édition/insertion est le mode qui permet de modifier du texte. On peut y rentrer de nombreuse façons :
    Sans modification :
    i (insert) : débuter à l’endroit courrant du curseur
    a (append) : débuter après le curseur
    I : Débuter au debut de la ligne
    A : Débuter à la fin de la ligne
    Avec modification :
    o : Débuter sur une ligne vide au dessus de la ligne courante
    O : Débuter sur une ligne vide sous la ligne courante
    cw (change word) : Effacer la fin du mot sous le curseur et commencer l’édition
    c$ : Effacer la fin de la ligne courrante et commencer l’édition
    cc : Effacer la ligne en cours et commencer l’édition
  • Le mode sélection permet de sélectionner du texte. On peut sélectionner de deux façons. Par caractères en appuyant sur « v », ou par ligne entière en appuyant sur « V ».

Navigation dans le fichier :

  • Avec les flèches (dans tous les modes) ou avec les touches h, j, k, l en mode commande (si le clavier est dépourvu de flèches ou si elles ne marchent pas (ça peut arriver dans des terminaux pourris)).
  • Le début de la ligne peut être atteint en mode commande ou sélection en appuyant sur « ^ » (sur les claviers européens, il faut parfois appuyer sur espace pour le valider.
  • La fin de la ligne peut être atteinte en mode commande ou sélection en appuyant sur « $ ».
  • On peut passer de mots en mots en appuyant sur w (word) (mot suivant) ou b (before). En appuyant sur W et B ont saute des mots plus longs (je vais appeler ça des super mots 😉 )(on ne s’arrête qu’aux espaces et à la ponctuation, pas aux symboles).
  • En effectuant une recherche. On peut rechercher un mot ou une expression régulière en appuyant sur « / » en mode commande. La saisie de la recherche se fait comme en mode édition. Une fois validée, le curseur ira se placer sous la prochaine occurance trouvée. On peu ensuite naviger dans les occurances en tapant n (next) (occurrence suivante) ou N (occurrence précédente). On peut aussi rechercher facilement le mot placé sous le curseur en appuyant sur * ou #.
  • On peut aussi trouver la parenthèse (idem pour les accolades ou les crochets) jumelle de celle qui se trouve sous le curseur courrant en appuyant sur %. C’est très pratique pour naviguer dans un code source.
  • En ligne de commande, on peut sauter directement à une ligne en entrant le numéro de la ligne. Par exemple : « :1 » pour retourner au début du fichier. Le carctère « $ » permet aussi de désigner la dernière ligne du fichier. Donc « :$ » permet d’atteindre directement la dernière ligne.

En mode commande, les commandes entrées peuvent être multipliées en entrant, avant de les taper, un multiplicateur. Par exemple, si l’on tape 10, on va se déplacer de 10 lignes vers le bas, ou encore en tapant 5n, on sauter 5 occurances de la dernière recherche. Puissant 😉

Toutes ces commandes permettent de naviguer très aisément dans un fichier.

Manipulation du texte :
Effacer un caractère :
En mode édition : ou . Ctrl + w (^w) permet d’effacer le dernier mot que l’ont vient d’entrer.
En mode commande : ou ‘x’, ou ‘X’ (on peut encore utiliser un multiplicateur).
En mode sélection : ‘x’

Annuler une action :
En mode commande, « u » permet d’annuler la dernière action faite. Ctrl + r (^r) permet de rétablir la dernière action annulée.

Manipuler les fichiers :
En ligne de commande

  • :w (write) : Sauvegarder le fichier en cours
  • :q (quit) : Quitter
  • :wq (write and quit) : Sauver et quitter.
  • :e monfichier.txt : Ouvrir le fichier monfichier.txt. Il est possible d’utiliser la complétion automatique du nom de fichier en appuyant sur . Si le fichier n’existe pas, il sera créer sous le nom donné la première fois qu’il sera enregistré (commande « :w »).
  • :sav monfichier.txt : Enregistrer le fichier courant sous le nom passé en argument.

Toutes ces commandes peuvent être forcées en ajoutant un ‘!’ juste après le commande (mais avant le ou les argument). Ceci est utile par exemple, si Vim se plaint que le fichier n’a pas été enregistré et que l’on souhaite tout de même quitter, il suffit alors d’entrer « :q! ».

  • :shell : permet d’ouvrir un shell (bash dans mon cas) temporaire pour, par exemple, faire une petite recherche ou lancer un commande rapide. En quittant le shell (ctrl+ d (^d) ou exit), on retrouve alors son vim tel qu’on l’a laissé.

la commande « :e » lancé sur un répertoire permet d’afficher la liste des fichiers dans ce répertoire. On peut alors positionner le curseur sur un fichier et appuyer sur pour l’ouvrir (par exemple, « :e . » affiche les fichiers du répertoire courant).

Manipulation du presse papier :
En gros, il faut savoir qu’il existe de nombreuses commandes pour manipuler le presse papier. Les deux premières commandes sont les plus simples, elles servent à coller le contenu du presse papier :

  • p : colle le contenu du presse papier après la position courante. Si le presse papier contient des lignes entières, le contenue sera inséré à la ligne suivante.
  • P : colle le contenu du presse papier avant la position courante. Si le presse papier contient des lignes entières, le contenue sera inséré à la ligne précédente.

Les commandes suivantes permetent d’enregistrer des données dans le presse papier.

  • y : est l’équivalent de copier.
  • d (delete) : est l’équivalent de couper. Il efface et met dans le presse papier.
  • c (change) : est l’équivalent de « d » puis « i ». Elle efface, met dans le presse papier et passe en mode insertion.

En mode commande, ces fonctions doivent être précédées d’une indication sur la porté de la commande. Il y a trois indications possibles :

  • w (word) : Fin du mot courrant.
  • W : Fin du super mot courrant
  • $ : Fin de la ligne courrante
  • En tapant deux fois la lettre de commande, on travaille alors sur la ligne entière.
  • En utilisant la lettre en majuscule, on travaille du caractère courant jusqu’à la fin de la ligne

Ce qui nous fait donc pour récapituler :

  • yw : copie la fin du mot courant dans le presse papier.
  • yW : copie la fin du super mot courant dans le presse papier.
  • y$ ou Y : copie la fin de la ligne courante dans le presse papier.
  • yy : copie une ligne entière dans le presse papier.
  • dw : supprime la fin du super mot courant et le met dans le presse papier.
  • dW : supprime la fin du mot courant et le met dans le presse papier.
  • d$ ou D : supprime la fin de la ligne courante et la met dans le presse papier.
  • dd : supprime une ligne entière et la met dans le presse papier.
  • cw : supprime la fin du mot courant, le met dans le presse papier et passe en mode édition.
  • cW : supprime la fin du super mot courant, le met dans le presse papier et passe en mode édition.
  • c$ ou C : supprime la fin de la ligne courante, la met dans le presse papier et passe en mode édition.
  • cc : supprime une ligne entière, la met dans le presse papier et passe en mode édition.

Toutes les commandes entrées peuvent être multipliées en entrant un multiplicateur avant. Par exemple, si l’on tape 10dd, l’on va effacer/couper 10 lignes, ou encore en tapant 5yw, on va copier 5 mots (incluant le mot courant).

En mode ligne de commande, la commande ne porte que sur des lignes entières et doit être précédée de la portée. La portée peut être sous 3 formes :

  • Un numéro de ligne (exemple, « :17d », efface la ligne 17)
  • Un ensemble de lignes séparées par une virgule (exemple, « :10,25y » copie les lignes 10 à 25). « $ » représente la dernière ligne du fichier. Une des deux extrémités peut être vide, la ligne courrante sera alors utilisée (exemple, « :,$d » efface toutes les lignes de la ligne courante à la fin du fichier).
  • Tout le fichier avec le caractère « % » (exemple, « :%y » copie tout le fichier).

En mode sélection :
Une fois que les caractères ou les lignes à copier sont surlignés, il suffit de taper la touche de la commande voulue. Attention, dans ce mode la commande « c » ne marche pas, mais elle peut être remplacée par un appuie sur « s » (substitute ?). Ne me demandez surtout pas pourquoi…

Voilà pour l’utilisation du presse papier.

La recherche, la substitution et la répétition automatique de commande :
La recherche a déjà été couverte dans le paragraphe consacré à la navigation dans le texte.

Substitution :
La substitution se fait en ligne de commande. La commande s’écrit de la façon suivante :

  • :s/recherche/remplace/
    ‘recherche’ est le mot ou l’expression régulière cherché.
    ‘remplace’ et la chaîne qui va remplacer l’expression trouvé.

Dans la forme suscité, la commande n’effectuera qu’un remplacement (la prochaine occurrence de l’expression).
En ajoutant un sélecteur de ligne on peut la faire s’appliquer sur plusieurs lignes. Par exemple « :%s/coucou/bonjour/ » ou « :10,15s/Windows/Linux/ ».
En ajoutant g à la fin, la fonction sera faite sur toutes les occurrence de la ligne et non pas sur la première trouvée. Par exemple « :%s/toto/titi/g »

Astuce : on peut chercher et remplacer des caractère spéciaux comme une tabulation ou un retour à la ligne. Il suffit de taper ctrl + v (^v), puis la touche voulue. Par exemple, la commande « :%s/ /^v/g » remplacera tous les groupes de 4 espaces trouvés par une tabulation.

Recherche et exécution de commande :
Il est possible de faire exécuter à Vim une recherche et de lui faire automatiquement exécuter une commande sur les occurrences trouvées.
Un exemple vaut mieux qu’un long discourt, « :%g/windows/d » effacera (le « d » à la fin) toutes les lignes (le « % » au début fait que la commande porte sur tout le fichier) contenant le terme « windows ».

Il est possible d’utiliser dans toutes les fonctions de recherches (/, :s et :g), des expressions régulières rationnelles. Par exemple :
« :%s/^/#/ » placera un # au début chaque ligne
« :%s/^$/# Ligne vide/ remplacera toutes les lignes vide par « # Ligne vide »
« :%s/[a-z0-9\.-_]*[@][a-z0-9\.-_]*[\.][a-z]*/*** email caché ***/g » remplacera tous les emails trouvés dans le fichier par « *** email caché *** ». Puissant, n’est ce pas ;-).

Manipulation de fenêtres :
Vim permet facilement de manipuler plusieurs fichiers simultanément en ouvrant plusieurs fenêtres. Les fenêtres découpent la suface du terminal en plusieurs parties. En ligne de commande :

  • :new : permet de couper le terminal horizontalement. La nouvelle partie ainsi créée se trouver en haut et sera vide (aucun fichier chargé). Il faudra alors utiliser la commande :e pour y ouvrir un fichier.

Les commandes :
Toutes les commandes de fenetres doivent être précédées d’un appuis sur ctrl et w (^w). Ensuite, il faut presser la touche correspondant à l’action voulue :

  • v (vertical) : Sépare la fenêtre courante en deux verticalement. La nouvelle fenêtre contiendra le fichier qui était ouvert dans la fenêtre d’origine. On peut ensuite en ouvrir un autre avec la commande « :e ».
  • w : Permet de passer d’une fenêtre à l’autre dans l’ordre où elles ont été créées.
  • W : Même chose, mais dans l’autre sens
  • flèches : Permettent de passer à une fenêtre voisine dans la direction de la flèche appuyée
  • + : Augmente la hauteur de la fenêtre en cours d’une ligne.
  • – : Diminue la hauteur de l’a fenêtre en cours d’une ligne.
  • > : Augmente la largeur de la fenêtre en cours d’une colonne.
  • < : Diminue la largeur de l’a fenêtre en cours d’une colonne.
  • x : Echange le contenue de deux fenêtre (je n’ai pas encore bien compris selon quelles règles).

Toutes ces commandes peuvent être précédée d’un multiplicateur. Par exemple « 10^w> » augmentera la largeur de la fenêtre courante de 10 colonnes.

Voilà, avec ça, vous devriez commencer a pouvoir vous servir très efficacement de Vim. Cela peut sembler très compliqué au début, mais il faut savoir que cela rentre progressivement. Au début, j’ai commencé par « i » et « :wq ». Petit à petit, j’ai ajouté des commandes à mon « vocabulaire ». C’est presque venu tout seul. Maintenant, je suis tellement intoxiqué que je n’arrive pas à me servir d’Open Office sans coller des :wq partout ! ;-).

(2 commentaires)

    • Titixe on 8 décembre 2006 at 13:47
    • Répondre

    Au moins on peut dire que tu es sympa avec tes potes

    • Yacine on 6 février 2009 at 22:31
    • Répondre

    merci Stephane

Laisser un commentaire

Your email address will not be published.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.