Comment supprimer plusieurs tampons dans Vim?

120

En supposant que j'ai plusieurs fichiers ouverts en tant que tampons dans Vim. Les fichiers ont *.cpp, *.het certains le sont *.xml. Je souhaite fermer tous les fichiers XML avec :bd *.xml. Cependant, Vim ne permet pas cela (E93: Plus d'une correspondance ...).

Y a-t-il un moyen de faire ça?

PS je sais que cela :bd file1 file2 file3fonctionne. Donc , puis - je évaluer en quelque sorte *.xmlà file1.xml file2.xml file3.xml?

Thanh DK
la source

Réponses:

194

Vous pouvez utiliser <C-a>pour terminer tous les matchs. Donc, si vous tapez :bd *.xmlpuis appuyez sur <C-a>, vim terminera la commande :bd file1.xml file2.xml file3.xml.

Björn Steinbrink
la source
8
@Florian <tab>vous permet uniquement de parcourir les correspondances, en mettant une seule entrée sur la ligne de commande, en <C-a>ajoutant toutes les correspondances à la fois.
Björn Steinbrink
mon dieu tu as raison! Désolé. tab ne fonctionne que lorsqu'il n'y a qu'un seul résultat possible.
Florian Klein
Comment utilisez-vous <Ca> avec vim sur tmux?
nabn
4
tmux ne lie pas <Ca> par défaut, mais si vous l'avez configuré pour utiliser par exemple <Ca> au lieu de <Cb> pour émuler l'écran, vous devez également le configurer pour mapper, par exemple, <Ca> a pour passer un < Ca> jusqu'au programme exécuté dans tmux. Le screen-keys.conf fourni avec tmux fait cela.
Björn Steinbrink
7
JFTR, au cas où vous auriez vim-rsiinstallé (je pense que c'est un must pour tout le monde sur * nix), pour obtenir le <C-a>travail de la manière originale dans la ligne de commande, vous devriez utiliser à la <C-x> <C-a>place.
kostix
43
:3,5bd[elete]   

Supprime la plage de tampon de 3 à 5.

Pêcheur
la source
19

Vous pouvez également utiliser alternativement:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers
Cylian
la source
1
Cela fonctionne bien. Je fais a : ls pour voir les numéros de tampon et eux : a, bbd pour supprimer les tampons du numéro a à b
Neaţu Ovidiu Gabriel
5

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'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>)
Luc Hermitte
la source
Je ne sais presque rien sur Vimscript, mais qu'en est-il de la fonction glob ()?
Thanh DK
1
glob()ne vous donnera que les fichiers existants (sur votre disque dur), et non les tampons ouverts.
Luc Hermitte
Vous avez oublié de fnameescape()tamponner les noms.
ZyX
Je viens de vérifier c:/Program files/foo.bar, et même foo.bar.fooet cela a parfaitement fonctionné. fnameescape()peut avoir été nécessaire si j'ai utilisé les noms de tampon. Mais je vérifie seulement si les noms de tampon correspondent à une expression donnée: \.{ext}$- Je donne des numéros de tampon à: bd`. Je n'ai aucune raison d'échapper à quoi que ce soit pour la correspondance regex.
Luc Hermitte
5

Essayez le script ci-dessous. L'exemple est pour "txt", changez-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 <Leader>bd :bufdo call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt )
      if (! &modified)
         bd
      endif
   endif
endfunction

[Edit] Idem 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
Habi
la source
1
Je n'aime pas :bufdocar cela gâche la fenêtre actuelle.
Luc Hermitte
3

J'avais également 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('<args>')

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

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

Kent
la source
Je me demande parfois pourquoi vim ne supporte pas les expressions régulières partout ( :badd, :bdelete, :bufdo, :bn...)
puk
1

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

Harry
la source
1

TABne remplira automatiquement qu'un seul fichier pour vous à partir de Vim 7.4.282 et
utilisera <c-a>pour compléter automatiquement tous les fichiers.

Vous pouvez simplement utiliser:

bd filetype

puis utilisez simplement <c-a>pour faciliter la complétion 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 se complétera automatiquement 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
stucash
la source