Buffer

De Vim-fr
Ébauche.png

Cette page est une ébauche concernant ViM, n'hésitez pas à l'améliorer en partageant vos connaissances.

Introduction

Dans vim les buffers représentent l'ensemble des fichiers qui ont été ouverts pendant la session courante. Chaque fois que vous éditez un fichier que vous n'avez pas édité précédemment, un buffer est crée.

Par exemple:

$ vim
# ouverture de vim, un buffer anonyme est créé
:w chocolat
# le buffer contient le fichier 'chocolat'


$ vim <fichier>
# ouverture de vim avec un buffer pour <fichier>
:e <autre fichier>
# un nouveau buffer contient <autre fichier>, l'ancien contient toujours <fichier>
:b <fichier>
# revient à l'édition de <fichier>
:b <tab>
# affiche :b <fichier>
:b <tab>
# affiche <autre fichier>
:buffers
# liste tous les buffers ouverts : <fichier> et <autre fichier>
:ls
# pareil que :buffers, mais en plus court
:bw
# ferme le buffer courant


Tandis que les buffers correspondent au contenu, la présentation est réalisée par des fenêtres (windows). À un instant donné, un buffer toujours chargé n'est pas nécessairement affiché dans une fenêtre, de même qu'il peut être affiché simultanément dans deux fenêtres Modèle:H.

Astuces

Navigation entre les buffers

   :b #    " ouvre le dernier buffer utilisé
   :b <n>  " ouvre le buffer numéro <n>
   :b <re> " ouvre le buffer contenant <re> dans son nom, eg: :b main va ouvrir src/main.c
   :bn     " buffer suivant (next)
   :bp     " buffer précédent (prev) (marche avec :bN)
   :bd     " supprime le buffer

Sélection d'un buffer

Le raccourcis suivant peut être d'un grande utilité lors de la manipulation de nombreux buffers :

   nmap <leader>b :ls<CR>:e#

Il ne vous reste plus qu'à trouver le buffer que vous voulez ouvrir, taper son numéro et valider par <CR>.

Fermer les vieux buffers

Vim garde donc en mémoire chaque buffer ouvert durant la session (c'est-à-dire depuis la dernière ouverture de Vim). Si vous ouvrez beaucoup de fichiers différents, vous aurez inévitablement un certain nombre de buffers chargés.

Pour vous présenter l'intérêt de l'astuce qui suit, considérez un cas concret :

  • Vous ouvrez, comme moi, un onglet (:tabedit) pour chaque "projet" ou petit travail sur lequel vous travaillez, à tel point que pour chacun d'entre eux, vous avez autant d'occasions de charger en mémoire des buffers, d'ouvrir des fenêtres (des splits ou vsplits).
  • Vous utilisez beaucoup la complétion automatique sur le nom de buffer après la commande :b, pour recharger dans la fenêtre courante un fichier édité auparavant.
  • Vous éditez des fichiers dont les noms sont similaires mais enregistrés dans des répertoires distincts, à tel point que vous finissez par les confondre et par perdre du temps à "tabuler" entre les propositions faites par :b <tab>.

Si vous vous trouvez de prêt ou de loin dans un ou plus de ces cas, cette fonction vous aidera peut-être :


   " Fonction pour epurer la liste des buffers {{{
   " Version amelioree, inspiree de :
   " http://stackoverflow.com/questions/1534835/how-do-i-close-all-buffers-that-arent-shown-in-a-window-in-vim
   function! CloseHiddenBuffers()
   " Tableau pour memoriser la visibilite des buffers
   let visible = {}
   " Pour chaque onglet...
   for t in range(1, tabpagenr('$'))
       " Et pour chacune de ses fenetres...
       for b in tabpagebuflist(t)
           " On indique que le buffer est visible.
           let visible[b] = 1 
       endfor
   endfor
   " Pour chaque numero de buffer possible...
   for b in range(1, bufnr('$'))
       " Si b est un numero de buffer valide et qu'il n'est pas visible, on le
       " supprime.
       if bufexists(b) && !has_key(visible, b)
           " On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui
           " sont pourtant charges en memoire.
           execute 'bwipeout' b
       endif
   endfor
   endfun
   " }}}


Elle permet de référencer, pour chaque onglet puis pour chaque fenêtre, les fichiers affichés et de supprimer les autres buffers avec :bwipeout. Il faut l'appeler avec la commande :call CloseHiddenBuffers() de temps en temps. Quand on perd la tête parce que :ls donne trop de résultats !

Références