Comment supprimer plusieurs tampons dans Vim?

En supposant que plusieurs fichiers soient ouverts en tant que tampons dans Vim. Les fichiers ont *.cpp , *.h et certains sont *.xml . Je veux fermer tous les fichiers XML avec :bd *.xml . Cependant, Vim ne le permet pas (E93: Plus d’un match …).

Est-ce qu’il y a un moyen de faire ça?

PS je sais que :bd file1 file2 file3 fonctionne. file1.xml file2.xml file3.xml je en quelque sorte évaluer *.xml à file1.xml file2.xml file3.xml ?

Vous pouvez utiliser pour terminer tous les matchs. Donc, si vous tapez :bd *.xml , puis appuyez sur , vim terminera la commande dans :bd file1.xml file2.xml file3.xml .

 :3,5bd[elete] 

Supprime la plage de tampon de 3 à 5.

Vous pouvez aussi utiliser alternativement:

  :.,$-bd[elete] " to delete buffers from the current one to last but one :%bd[elete] " to delete all buffers 

Vous pouvez utiliser ceci.

 :exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ') 

Il devrait être assez facile de l’append à une commande.

 function! s:BDExt(ext) let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && bufname(v:val) =~ "\.'.a:ext.'$"') if empty(buffers) |throw "no *.".a:ext." buffer" | endif exe 'bd '.join(buffers, ' ') endfunction command! -nargs=1 BDExt :call s:BDExt() 

Essayez le script ci-dessous. L’exemple est pour “txt”, modifiez-le si nécessaire, par exemple en “xml”. Les tampons modifiés ne sont pas supprimés. Appuyez sur \ bd pour supprimer les tampons.

 map bd :bufdo call DeleteBufferByExtension("txt") function! DeleteBufferByExtension(strExt) if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt ) if (! &modified) bd endif endif endfunction 

[Edit] Same without: bufdo (comme demandé par Luc Hermitte, voir commentaire ci-dessous)

 map bd :call DeleteBufferByExtension("txt") function! DeleteBufferByExtension(strExt) let s:bufNr = bufnr("$") while s:bufNr > 0 if buflisted(s:bufNr) if (matchstr(bufname(s:bufNr), ".".a:strExt."$") == ".".a:strExt ) if getbufvar(s:bufNr, '&modified') == 0 execute "bd ".s:bufNr endif endif endif let s:bufNr = s:bufNr-1 endwhile endfunction 

J’avais aussi besoin de cette fonctionnalité tout le temps. C’est la solution que j’ai dans mon vimrc.

 function! GetBufferList() return filter(range(1,bufnr('$')), 'buflisted(v:val)') endfunction function! GetMatchingBuffers(pattern) return filter(GetBufferList(), 'bufname(v:val) =~ a:pattern') endfunction function! WipeMatchingBuffers(pattern) let l:matchList = GetMatchingBuffers(a:pattern) let l:count = len(l:matchList) if l:count < 1 echo 'No buffers found matching pattern ' . a:pattern return endif if l:count == 1 let l:suffix = '' else let l:suffix = 's' endif exec 'bw ' . join(l:matchList, ' ') echo 'Wiped ' . l:count . ' buffer' . l:suffix . '.' endfunction command! -nargs=1 BW call WipeMatchingBuffers('') 

Maintenant, je peux juste faire :BW regex (par exemple :BW \.cpp$ et effacer tous les tampons correspondants qui correspondent à ce modèle dans leur chemin.

Si vous souhaitez supprimer plutôt que nettoyer, vous pouvez bien sûr remplacer exec 'bw ' . join(l:matchList, ' ') exec 'bw ' . join(l:matchList, ' ') avec exec 'bd ' . join(l:matchList, ' ') exec 'bd ' . join(l:matchList, ' ')

Très simplement: utilisez la commande :bd[elete] . Par exemple :bd[elete] buf#1 buf#5 buf#3 supprimera les tampons 1, 3 et 5.

TAB ne complétera automatiquement qu’un fichier à partir de Vim 7.4.282
utilisez pour compléter automatiquement tous les fichiers.

Vous pouvez simplement utiliser:

 bd filetype 

utilisez simplement pour faciliter la finalisation de tous les fichiers ouverts de type de fichier spécifié.

Par exemple, vous pouvez utiliser 1.xml, 2.xml, 3.xml et 4.xml:

 bd xml 

puis appuyez sur

vim se complétera automatiquement comme suit:

 bd 1.xml 2.xml 3.xml 4.xml 

vous pouvez simplement appuyer sur Entrée pour terminer la commande.

Si vous avez apporté des modifications à l’un des fichiers mentionnés ci-dessus, n’oubliez pas de le faire:

 bd! xml