2011-07-01 6 views
15

J'ai quelque chose comme 120 tampons ouverts dans Vim en ce moment. Environ 50% de ces tampons sont des fichiers vides. Je voudrais en quelque sorte utiliser bufdo! pour fermer tous les tampons qui sont vides. Est-il possible que je peux dire:Supprimer tous les tampons vides dans VIM

bufdo! (something) 

(something) est une commande conditionnelle qui bdelete s le tampon courant si la longueur/taille de ce tampon est égal à zéro?

+0

Notez que la commande ': bufdo'-argument ne doit pas ajouter ou supprimer des tampons (voir': help: bufdo'). –

Répondre

6

La seule chose que je peux penser à ceci est de faire une fonction qui signale si le tampon est vide ou non. Quelque chose comme ceci:

function! BufferIsEmpty() 
    if line('$') == 1 && getline(1) == '' 
     return 1 
    else 
     return 0 
    endif 
endfunction 

" Test it like this: 
echo BufferIsEmpty() 
+2

Condition similaire: 'line2byte (ligne (" $ ") + 1) <= 2'. – ZyX

+0

@ZyX: Pourquoi pas 'line2byte (ligne ('$')) <2'? –

+0

@ib 'vim -u AUCUN -N -c 'call setline (". "," Abc ") | echo line2byte (ligne ("$")) '' – ZyX

12

Comme il ne peut pas influer sur la liste des tampons avec une commande :bufdo -argument (voir :help :bufdo), nous devons utiliser plus script Vim verbeux encore assez simple.

La fonction ci-dessous énumère tous les numéros de tampons existants et supprime ceux qui ne porte pas de nom (affiché comme [No Name] dans l'interface ) et les modifications non enregistrées. (Ce dernier est garanti par la commande :bdelete qui, sans le signe !, ne supprime pas un tampon modifié).

function! DeleteEmptyBuffers() 
    let [i, n; empty] = [1, bufnr('$')] 
    while i <= n 
     if bufexists(i) && bufname(i) == '' 
      call add(empty, i) 
     endif 
     let i += 1 
    endwhile 
    if len(empty) > 0 
     exe 'bdelete' join(empty) 
    endif 
endfunction 

Si vous souhaitez supprimer des tampons vides complètement, y compris ceux débarquées, pensez (avec précaution!) Remplaçant bdelete avec bwipeout (voir :help :bd, :help :bw).

Pour tester le contenu d'un tampon à supprimer, utilisez la fonction getbufline(). Par exemple, pour être absolument certain que le tampon ne contient aucun texte, modifiez l'instruction if à l'intérieur de la boucle while comme suit.

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == [''] 

Notez que bufexists() est changé en bufloaded() ici. C'est nécessaire car il est possible d'obtenir le contenu seulement de ces tampons qui sont chargés (pour les tampons déchargés getbufline() renvoie la liste vide indépendamment de leur contenu).

9

J'utilise la fonction suivante pour faire le travail:

function! s:CleanEmptyBuffers() 
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")') 
    if !empty(buffers) 
     exe 'bw ' . join(buffers, ' ') 
    endif 
endfunction 

Il est très similaire à la version de ib sauf qu'il laisse le tampon quickfix seul (aussi longtemps que tout autre tampon vide qui est affiché dans une fenêtre)

Questions connexes