Amusons nous avec les folds dans vim

C'est amusant, vim. On l'utilise depuis des années, et on découvre encore de nouvelles fonctionalités. L'autre jour, par exemple, j'ai découvert les folds, replis en bon français.

Qu'est ce qu'un fold ? Le mieux, c'est que je vous montre un exemple. Voici un fichier édité sans repli :

function tresLongueFonction($parametre) {
    var $var1;
    var $var2;
    var $var3;
    var $var4;

    premiereFonction();
    instruction();
    encoreUneInstruction();
    uneDeuxiemeFonction();
    encoreUneInstruction();
    etc();
    etc();
    etc();
    tresLongueSequenceDInstructions();
    laPartieDuFichierSurLaquelleJeTravaille();
}

Voici le même fichier, édité avec un repli

function tresLongueFonction($parametre) {
+-- 14 lignes : var $var1;------------------------------
    laPartieDuFichierSurLaquelleJeTravaille();
}

Vous l'aurez compris, les folds permettent de "plier" à loisir certaines parties du fichier. C'est trés pratique quand on veut masquer une portion de code qu'on ne veut pas voir, ou pour rapprocher deux zones qu'on édite coucouramment. Ensuite, il est possible d'ouvrir et de fermer à l'envie les replis définis.

Il est possible de définir autant de folds qu'on veut dans un fichier. On peut également les imbriquer les uns dans les autres.

Créer / supprimer des replis

La plupart des commandes relatives aux replis commencent par un 'z' (moyen mnémotecnhique : le z ressemble à une feuille de papier pliée).

C'est la commande zf qui est utilisée pour créer les replis. elle est utilisable de plusieurs façons.

La méthode la plus simple, c'est de passer en mode visuel avec V, de sélectionner vos lignes, et de taper zf. Et voilà.

Plus efficace, la commande zf< déplacement >. zf10j va plier 11 lignes (la ligne courante et les 10 suivantes). Autre exemple, placez vous sur une accolade ouvrante, et tapez zf% pour replier toute la zone entre les deux accolades. Joli, non ?

Pour supprimer un repli, rien de plus simple : placez votre curseur dessus (ou dedans), et tapez zd. zD permet de supprimer aussi les replis imbriqués. tapez zE pour supprimer tous les folds du fichier.

Attention, supprimer un fold ne supprime pas son contenu : cela ne modifie en rien le fichier. Notez aussi que la commande d'annulation (u) ne prends pas en compte les replis : il est impossible d'annuler la suppression d'un fold.

En revanche, si vous supprimer la ligne d'un repli fermé (avec dd, par exemple), vous supprimerez tous son contenu.

Ouvrir / fermer les folds

Les folds n'ont un réel intérêt qu'à partir du moment ou on peut les ouvrir et refermer (n'est-ce pas ?).

Placez votre curseur sur un fold fermé. Tapez zo pour l'ouvrir (o pour open, bien entendu). Si votre pli contient des plis imbriqués, ceux-ci resteront fermés. Pour ouvrir recursivement tous les folds contenus dans celui sous le curseur, tapez zO. Pour ouvrir absolument tous les folds du fichier, tapez juste zR.

Pour fermer le fold de plus bas niveau dans lequel vous êtes, facile, tapez zc, ou zC pour fermer TOUS les replis autour du curseur. zM ferme tous les replis du fichier.

Et pour bien se la jouer...

Une des options relative aux folds, la foldmethod est intéressante. Par défaut, elle est configurée en manuel, c'est à dire qu'il faut tout gérer à la main. Mais il est possible de définir des replis automatiquement selon l'indentation. Pour cela, utilisez la commande :

:set foldmethod=indent

Il est également possible d'utiliser des marqueurs textuels qui s'insèrent dans le fichier (pratique pour conserver ses replis d'une ouverture de fichier sur l'autre). Testez donc :

:set foldmethod=marker

Enregistrer ses replis

Bon, vous avez défini des tas de replis que vous aimeriez conserver la prochaine fois que vous ouvrirez votre fichier. Et bien dommage, c'est impossible. Nan, je rigole, bien sur. Avec vim, tout est possible.

Quand vous voulez sauvegarder l'état du fichier, taper :

:mkview

À la prochaine ouverture, vous pourrez taper

:loadview

pour restaurer l'état sauvegardé. Pour plus d'infos : help: folds. Amusez vous bien.