Vim : aligner les cellules d'un tableau

Cet article est destiné aux gens qui ont besoin d'aligner un caractère particulier dans Vim (par exemple pour aligner différentes cellules d'un tableau, ou pour les psychopathes qui comme moi alignent les signes égal en programmation), ainsi qu'à tous ceux qui aiment bien les astuces matoises.

Commençons par un avant-goût

Avant :

Titre | Note
============
Doom | 5/5
Vietcong | 4/5 
Project IGI 2 | 1/5

Après :

Titre         | Note
====================
Doom          | 5/5
Vietcong      | 4/5 
Project IGI 2 | 1/5

ou, plus ridicule...

Avant :

int ma_variable = 0;
int autre_variable = -1;

Après :

int ma_variable    = 0;
int autre_variable = -1;

Si ça vous paraît un peu cocasse, saugrenu et dérisoire, c'est parce que vous n'avez jamais eu besoin de le faire sur un tableau de 2000 lignes...

Dis papa, comment on fait...

On va prendre l'exemple du tableau (mais il suffit de remplacer | par = pour l'exemple des signes égal).

Commencez par faire un petit replacement :

:%s/|/                                  |/

Ceci a pour objectif de rajouter plein d'espaces avant le signe.

Il vous faut un peu plus d'espaces que votre case la plus longue (ici Project IGI 2). J'aime bien la méthode dite du pif. Certains préfèrerons peut-être se mettre sur la ligne la plus longue et faire un :

yypv$hr dd

pour ensuite replacer la série d'espaces précédente par un <Ctrl+r>"... c'est vous qui voyez[1]...

Ensuite, vous allez supprimer tous les espaces inutiles (c'était bien la peine).

:%s/\%15cs*//

Ici 15 est le nombre de caractère après lesquels je veux tronquer mes espaces. Il suffit de se placer à la fin de la case la plus longue et de noter le nombre que vous donne gentiment Vim en bas à droite.

Et pouf, c'est bon.

Ouais, l'arnaque... C'est pas si automatique que ça !

C'est vrai, mais il s'agissait d'un premier alignement (par exemple parce que vous n'avez pas commencé à aligner vos symboles dès le début). Une fois que le texte est déjà aligné, c'est surtout l'ajout (ou la suppression) d'une ligne qui va vous embêter, car il faudra tout réaligner. Par exemple pour la suite on va supprimer Project IGI.

Deux astuces :

  1. soit vous décidez de réaligner vos lignes en faisant un rechercher/replacer et en supprimant/ajoutant le bon nombre d'espaces...
  2. soit vous faites une sélection par blocs !

Sélection par blocs ?

  • Placez-vous à l'endroit marqué d'une croix.
Titre       x | Note
====================
Doom          | 5/5
Vietcong      | 4/5
  • Faites Ctrl+v. Vim vous indique en bas à gauche VISUEL BLOC.
  • Déplacez-vous à l'endroit marqué d'une croix (vous devriez voir une sélection rectangulaire englobant plein d'espaces) :
Titre         | Note
====================
Doom          | 5/5
Vietcong x    | 4/5
  • Faites d pour supprimer le tout.

Inversement, pour ajouter des espaces, faites de même une sélection en rectangle puis faites I (i majuscule, comme Insertion) puis tapez le nombre d'espaces nécessaire suivi de Esc. Les espaces seront insérés sur toutes les lignes.

Et ensuite ?

Si vous avez une autre solution, je suis preneur.

Vous trouverez d'autres exemples sur le wiki de Vim sur Wikia.

Si vous utilisez souvent cette astuce je vous recommande même d'écrire une petite fonction qui le fait tout seul et qu'il n'y aura plus qu'à rattacher à une touche de votre clavier... mais ça c'est une autre histoire.

Notes

[1] yyp duplique la ligne courante, v$h sélectionne cette ligne sauf le dernier caractère, r replace toute cette ligne par des espaces, dd la supprime, <Ctrl+r>" colle cette ligne pendant l'écriture d'une commande... et c'est beaucoup plus rapide à faire qu'à écrire ;)

Vus : 579
Publié par djibux : 113