En supposant que j'ai plusieurs fichiers 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'une correspondance ...).
Est-ce qu'il y a un moyen de faire ça?
P.S. Je le sais :bd file1 file2 file3
travaux. Puis-je en quelque sorte évaluer *.xml
à file1.xml file2.xml file3.xml
?
Vous pouvez utiliser <C-a>
pour terminer tous les matchs. Donc, si vous tapez :bd *.xml
puis appuyez sur <C-a>
, vim exécutera la commande pour :bd file1.xml file2.xml file3.xml
.
:3,5bd[elete]
Supprime la plage de mémoire tampon de 3 à 5.
Vous pouvez également utiliser alternativement:
:.,$-bd[elete] " to delete buffers from the current one to last but one
:%bd[elete] " to delete all buffers
Essayez le script ci-dessous. L'exemple est pour "txt", changez-le au besoin, par ex. à "xml". Les tampons modifiés ne sont pas supprimés. Appuyez sur\bd pour supprimer les tampons.
map <Leader>bd :bufdo call <SID>DeleteBufferByExtension("txt")
function! <SID>DeleteBufferByExtension(strExt)
if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt )
if (! &modified)
bd
endif
endif
endfunction
[Modifier] Même sans: bufdo (comme demandé par Luc Hermitte, voir commentaire ci-dessous)
map <Leader>bd :call <SID>DeleteBufferByExtension("txt")
function! <SID>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
Vous pouvez l'utiliser.
:exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ')
Il devrait être assez facile de l'ajouter à 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(<f-args>)
Moi aussi, j'avais toujours besoin de cette fonctionnalité. 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('<args>')
Maintenant, je peux simplement faire :BW regex
(Par exemple :BW \.cpp$
Et effacer tous les tampons correspondants qui correspondent à ce modèle dans leur chemin d'accès.
Si vous souhaitez supprimer plutôt qu'effacer, vous pouvez bien sûr remplacer exec 'bw ' . join(l:matchList, ' ')
par exec 'bd ' . join(l:matchList, ' ')
Très simplement: utilisez le :bd[elete]
commande. Par exemple, :bd[elete] buf#1 buf#5 buf#3
supprimera les tampons 1, 3 et 5.
TAB
ne complétera automatiquement qu'un seul fichier à partir de Vim 7.4.282
utilisation<c-a>
pour compléter automatiquement tous les fichiers.
Vous pouvez simplement utiliser:
bd filetype
alors utilisez simplement <c-a>
pour faciliter l'achèvement de tous les fichiers ouverts du type de fichier spécifié.
par exemple, vous avez 1.xml, 2.xml, 3.xml et 4.xml, vous pouvez faire:
bd xml
puis appuyez <c-a>
vim effectuera la saisie semi-automatique pour vous 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 faire:
bd! xml