Encore plus de vim-fu : Gestion des buffers, fenêtres et onglets sous vim (vim-fu partie 2 !)

Posted on dim. 18 février 2018 in tuto

Trois ans après un premier tuto sur les bases de vim et deux ans après un tuto sur les fonctionnalités avancées, on est repartis pour toujours plus d'astuces pour vim ! (oui, mon rythme de publication ne ressemble à rien...) Du coup, aujourd'hui, on va voir comment vim gère les fichiers et leur affichage, et comment utiliser vim pour manipuler plusieurs fichiers à la fois de manière efficace !

Buffers, windows, tabs

Les buffers, les fenêtres et les onglets sont les trois niveaux d'abstraction utilisés par vim pour définir ce qui s'affiche à l'écran. Il est donc important de bien comprendre ces trois concepts pour les manipuler au mieux et devenir vraiment efficace. Grossièrement, un buffer est un fichier, qui s'affiche dans une fenêtre, qui appartient à un onglet. C'est pas clair ? C'est normal, la suite de l'article est là pour expliquer tout ça !

Les buffers

Les buffers sont le niveau d'abstraction le plus bas pour les fichiers. En gros, à chaque fois que vim charge un fichier dans sa mémoire, il crée un buffer qui lui correspond. Attention, on parle bien d'un élément dans la mémoire de vim, il ne s'agit pas d'un affichage : le buffer peut très bien être ouvert sans être affiché. Par exemple, si vous lancez vim avec deux noms de fichiers en paramètre, il ne vous affichera que le premier. Pourtant, le second est bien ouvert aussi, dans un buffer qui lui est dédié, mais il n'est pas affiché. La preuve, si vous essayez de quitter vim avec :q, il vous indiquera que vous avez un autre fichier d'ouvert et refusera de quitter.

Manipuler les buffers

Ouvrir plusieurs buffers

Quand on ouvre un fichier avec vim, il crée automatiquement un buffer et une fenêtre : le fichier est chargé en mémoire et affiché. Pour ouvrir un second buffer, on utilise la commande :edit <nom du fichier>. Un buffer est créé pour le nouveau fichier et affiché, mais l'ancien fichier n'est pas fermé : il est basculé en arrière-plan. Idem, si vous lancez vim avec deux fichiers (ou plus) en paramètre, chaque fichier sera ouvert dans un buffer, mais un seul sera affiché (le premier).

Lister les buffers

Pour lister les buffers ouverts, il faut utiliser la commande :ls :

Résultat de la commande :ls avec plusieurs fichiers ouverts dans vim

Ici on voit que le buffer 1 est actif à l'aide du '%a' devant son nom.

Naviguer entre les buffers

Une fois qu'on connaît la liste des buffers ouverts, on peut facilement passer d'un buffer à un autre avec les commandes :bp et :bn, comme "buffer Previous" et "buffer Next", qui permettent donc respectivement d'afficher le buffer précédent et le buffer suivant.

On peut aussi directement sauter à un autre buffer avec la commande :bX, avec X le numéro du buffer (première colonne dans les résultats du :ls). Par exemple :b4 sur la capture d'écran précédente permettra d'aller sur le buffer du fichier "mail_postfix.md".

Mettre en arrière-plan un buffer modifié

Si vous modifiez un buffer et que vous essayez de passer sur un autre, vous recevrez une erreur :

Tentative de mettre en arrière plan un buffer modifié

Pour pouvoir passer un arrière-plan un buffer modifié, il faut taper la commande :set hidden. Le plus simple, si vous souhaitez ce comportement par défaut, est de l'ajouter à votre fichier de configuration .vimrc.

Enregistrer les modifications

Si vous utilisiez déjà vim, vous connaissez déjà celle-ci (sinon, n'hésitez pas à faire un tour sur mon tuto sur les bases de vim) : enregistrer un buffer se fait avec :w. Vous pouvez également enregistrer tous les buffers ouverts avec :wa.

Fermer un buffer

C'est bien beau de manipuler tous ces buffers, mais au bout d'un moment il faut fermer. Pour cela on utilise :bdX, comme "Buffer Delete" avec X le numéro du buffer à fermer. Si on tape juste :bd, c'est le buffer actuellement affiché qui sera fermé.

Les fenêtres (splits)

Avant, vous lanciez vim pour éditer un fichier à la fois. Maintenant que vous pouvez manipuler les buffers, vous pouvez manipuler plusieurs fichiers dans une fenêtre. C'est super pratique ! Mais si on pouvait aller plus loin... Genre... Manipuler plusieurs fichiers dans plusieurs fenêtres ? C'est là qu'interviennent les windows, ou splits.

Attention : dans cet article, quand je parle de fenêtres, il ne s'agit pas des fenêtres de votre terminal dans lequel est lancé vim, mais bien d'éléments dans une seule instance de vim. Ces indications sont donc parfaitement valables même si vous n'avez pas d'environnement graphique, en ssh par exemple.

Ouvrir une fenêtre

Ouvrir un fichier dans une nouvelle fenêtre

Les splits permettent de couper l'affichage en deux, verticalement ou horizontalement, pour afficher plusieurs buffers en même temps à l'intérieur de vim. Le plus explicite c'est de tester ! Ouvrez un fichier dans vim et tapez la commande :sp [chemin du second fichier à ouvrir] pour faire un split horizontal. Pouf ! L'interface se coupe en deux horizontalement et vous pouvez éditer les deux buffers à la fois, dans deux fenêtres. Pour faire la même chose avec les fenêtres côte à côte, c'est :vsp [chemin du fichier], comme "Vertical SPlit". Facile à retenir !

Une instance unique de vim avec deux fenêtres ouvertes

Bien sûr, il est possible d'ouvrir plus de deux fenêtres à la fois, et de mélanger vertical et horizontal !

Une instance unique de vim avec trois fenêtres ouvertes

Il est également possible d'ouvrir directement plusieurs fichiers dans une interface splittée depuis la ligne de commande, avec l'option -o :

$ vim file1 file2 file3 ... -o

Les fichiers sont tous ouverts les uns au dessus des autres dans des splits horizontaux. Si vous préférez les splits verticaux, utilisez -O (un o majuscule).

Déplacer un buffer dans une nouvelle fenêtre

Si vous avez un buffer en arrière-plan et que vous souhaitez le déplacer vers un nouveau split, vous pouvez utiliser la commande :sbX, comme "Split Buffer", avec X le numéro de buffer. Pour obtenir un split horizontal plutôt que vertical, la commande est :vert sbX.

Naviguer entre les splits

C'est bien beau d'avoir ouvert tous ces fichiers dans un seul terminal, mais comment naviguer entre les fenêtres ? Si vous avez activé la souris dans vim, pas de soucis, mais personnellement j'ai horreur de ça. Du coup, on navigue au clavier !

Tout d'abord il faut passer en mode Normal avec la touche Esc. Ensuite, le raccourci magique à retenir c'est ^w, en notation *nix, donc Control+w pour les êtres humains que nous sommes.

Une fois ce raccourci saisi... Rien. Et pour cause, vous lui avez simplement indiqué que vous vouliez vous déplacer entre les buffers. Maintenant, il faut lui dire où aller. Pour ça plusieurs solutions :

  • Soit utiliser la touche w pour faire passer le curseur sur le buffer suivant, puis au troisième si vous refaites, etc... jusqu'à revenir au premier. À éviter si vous avez beaucoup de fenêtres ouvertes donc ! (astuce : inutile de relâcher la touche contrôle, tapez juste sur contrôle+w plusieurs fois jusqu'à arriver à destination...)
  • Soit utiliser les touches de déplacement de vim hjkl : h pour déplacer le curseur vers le buffer directement à gauche, j pour le bas, k pour le haut et l pour la droite. C'est un coup de main à prendre, mais ça marche rudement bien.

Fermer une fenêtre

Pour fermer une fenêtre, vous connaissez déjà la commande ! Il s'agit tout simplement de la commande que vous utilisiez déjà pour fermer vim quand vous n'aviez qu'une seule fenêtre : :q. Si vous en avez plusieurs, cela fermera la fenêtre active (celle sur laquelle il y a le curseur).

Si vous avez plusieurs fenêtres ouvertes et que vous vouliez quitter vim, il peut être fastidieux de fermer les fenêtres une par une. Vous pouvez donc utiliser :qa pour tout fermer d'un coup. Et si vous n'aviez pas enregistré certains buffers, vous pouvez enregistrer l'ensemble en fermant grâce à :wqa.

Les onglets (tabs)

On arrive au troisième et dernier niveau d'abstration, les onglets (tabs). Ajoutés avec la version 7 (mai 2006), les tabs étaient déjà présents et utilisés dans de nombreux éditeurs de texte et manquaient à vim. Mais là où les autres éditeurs utilisent les onglets comme une vue sur un fichier ouvert, vim s'y prend un peu différemment. Et pour cause : les vues multiples existaient déjà, les fameuses fenêtres.

Du coup, les onglets de vim sont un niveau au dessus : chaque onglet est un ensemble de fenêtres (splits). Le gros avantage, c'est que vous pouvez grouper facilement plusieurs fichiers. Par exemple, si vous codez un programme client/serveur, vous pouvez avoir un onglet rassemblant plusieurs fenêtres de code pour le client, et un second avec les sources du serveur. Pour cette raison, les tabs de vim sont souvent comparés à des "workspaces".

(D'ailleurs question existentielle, vous dites "un" ou "une" tab ? Je suis en plein bug... Du coup je vais dire onglet hein.)

Ouvrir un onglet

Ouvrir un fichier dans un nouvel onglet

Si vous avez ouvert un fichier dans vim, la commande pour ouvrir un autre fichier dans un nouvel onglet est :tabnew <nom du fichier>.

Vous pouvez aussi lancer vim avec plusieurs fichiers ouverts chacun dans un onglet avec l'option -p :

$ vim file1 file2 file3 ... -p

Déplacer une fenêtre dans un nouvel onglet

Si vous avez déjà deux splits ouverts, vous pouvez déplacer le split vers un nouvel onglet grâce au raccourci ^w T (Controle+w suivi de T majuscule). En revanche, il n'y a pas de commande pour déplacer une fenêtre vers un onglet déjà existant, MAIS il y a une astuce ! Il suffit de passer par le buffer !

Vous pouvez fermer la fenêtre dans l'onglet d'origine avec :q, aller dans l'autre onglet (voir après) et rouvrir le buffer dans une nouvelle fenêtre dans cet onglet avec :sbX. Easy !

Vous pouvez lister les onglets ouverts avec la commande :tabs.

Naviguer entre les onglets

Pour naviguer entre les onglets, vous avez plusieurs possibilités :

  • Les commandes :tabn (tab Next), :tabp (tab Previous), :tabfirst et :tablast permettent d'aller respectivement à l'onglet suivant, précédent, au premier onglet, au dernier onglet.
  • En mode normal, vous pouvez utiliser le raccourci gt (Go Tab) pour passer à l'onglet suivant et gT pour le précédent. Vous pouvez aussi utiliser Xgt pour sauter à l'onglet numéro X.

Réordonner les onglets

Pour modifier l'ordre des onglets, vous pouvez utiliser la commande :tabm qui déplacera l'onglet actif :

  • Sans paramètre, l'onglet est placé en dernier
  • Avec :tabm 0, l'onglet est placé en premier
  • Avec :tabm X, l'onglet est placé après l'onglet numéro X.

Fermer les onglets

Pour fermer un onglet, il suffit de fermer toutes les fenêtres qu'il contient avec :q. Facile !

Et voilà ! Vous pouvez maintenant utiliser vim comme un pro !

Il y a encore plein d'astuces à partager, mais si vous maîtrisez les notions présentées dans ce tuto, vous aurez tout ce qu'il faut pour utiliser vim de manière efficace, que ce soit pour éditer un fichier de configuration sur un serveur ou pour développer des projets de grande ampleur !