Wie lösche ich mehrere Puffer in Vim?


120

Angenommen, ich habe mehrere Dateien in Vim als Puffer geöffnet. Die Dateien haben *.cpp, *.hund einige sind *.xml. Ich möchte alle XML-Dateien mit schließen :bd *.xml. Vim erlaubt dies jedoch nicht (E93: Mehr als eine Übereinstimmung ...).

Gibt es eine Möglichkeit, dies zu tun?

PS Ich weiß, dass das :bd file1 file2 file3funktioniert. So kann ich beurteilen irgendwie *.xmlzu file1.xml file2.xml file3.xml?

Antworten:


194

Sie können verwenden <C-a>, um alle Übereinstimmungen abzuschließen. Wenn Sie also tippen :bd *.xmlund dann drücken <C-a>, führt vim den Befehl zu aus :bd file1.xml file2.xml file3.xml.


8
Mit @Florian <tab>können Sie nur durch die Übereinstimmungen blättern , indem Sie einen einzelnen Eintrag in die Befehlszeile einfügen und <C-a>alle Übereinstimmungen gleichzeitig hinzufügen.
Björn Steinbrink

Mein Gott, du hast recht! Es tut uns leid. Die Registerkarte funktioniert nur, wenn nur ein mögliches Ergebnis vorliegt.
Florian Klein

Wie benutzt man <Ca> mit vim unter tmux?
Nabn

4
tmux bindet <Ca> standardmäßig nicht, aber wenn Sie es so konfiguriert haben, dass zB <Ca> anstelle von <Cb> zum Emulieren des Bildschirms verwendet wird, sollten Sie es auch so konfigurieren, dass es beispielsweise <Ca> a zuordnet, um ein <zu übergeben Ca> bis zum Programm, das in tmux ausgeführt wird. Die screen-keys.conf, die mit tmux geliefert wird, macht das.
Björn Steinbrink

7
JFTR, falls Sie vim-rsiinstalliert haben (ich denke, es ist ein Muss für alle auf * nix), um die <C-a>Arbeit auf die ursprüngliche Weise in der Befehlszeile zu erhalten, sollten Sie <C-x> <C-a>stattdessen verwenden.
Kostix

43
:3,5bd[elete]   

Löscht den Pufferbereich von 3 bis 5.


19

Sie können auch alternativ verwenden:

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

1
Das funktioniert gut. Ich mache a : ls , um Puffernummern zu sehen und sie : a, bbd , um Puffer von Nummer a nach b zu löschen
Neaţu Ovidiu Gabriel

5

Sie können dies verwenden.

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

Es sollte ziemlich einfach sein, es einem Befehl hinzuzufügen.

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>)

Ich weiß so gut wie nichts über Vimscript, aber wie wäre es mit der Funktion glob ()?
Thanh DK

1
glob()Sie erhalten nur vorhandene Dateien (auf Ihrer Festplatte) und keine geöffneten Puffer.
Luc Hermitte

Sie haben vergessen, fnameescape()Namen zu puffern.
ZyX

Ich habe gerade nachgesehen c:/Program files/foo.barund sogar foo.bar.foound es hat perfekt funktioniert. fnameescape()Möglicherweise war es erforderlich, wenn ich die Puffernamen verwendet habe. Aber ich überprüfe nur, ob die \.{ext}$Puffernamen mit einem bestimmten Ausdruck übereinstimmen: - Ich gebe: bd` Puffernummern. Ich habe keinen Grund, irgendetwas für Regex-Matching zu entkommen.
Luc Hermitte

5

Probieren Sie das folgende Skript aus. Das Beispiel ist für "txt", ändern Sie es nach Bedarf, z. B. in "xml". Geänderte Puffer werden nicht gelöscht. Drücken Sie \ bd, um die Puffer zu löschen.

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

[Bearbeiten] Gleich ohne: bufdo (wie von Luc Hermitte angefordert, siehe Kommentar unten)

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

1
Ich mag es nicht, :bufdoda es das aktuelle Fenster durcheinander bringt.
Luc Hermitte

3

Auch ich brauchte diese Funktionalität die ganze Zeit. Dies ist die Lösung, die ich in meinem vimrc habe.

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>')

Jetzt kann ich es einfach tun :BW regex(z. B. :BW \.cpp$alle passenden Puffer löschen, deren Pfadname mit diesem Muster übereinstimmt.

Wenn Sie lieber löschen möchten als wischen, können Sie natürlich ersetzen exec 'bw ' . join(l:matchList, ' ')mitexec 'bd ' . join(l:matchList, ' ')


Ich frage mich manchmal , warum vim nicht reguläre Ausdrücke unterstützen überall ( :badd, :bdelete, :bufdo, :bn...)
puk

1

Ganz einfach: Verwenden Sie den :bd[elete]Befehl. Zum Beispiel :bd[elete] buf#1 buf#5 buf#3wird die Puffer 1, 3 und 5 löschen.


1

TABwird ab Vim 7.4.282 nur eine Datei für Sie automatisch vervollständigen
, <c-a>um alle Dateien automatisch zu vervollständigen .

Sie können einfach verwenden:

bd filetype

dann einfach benutzen <c-a> , um die Vervollständigung aller geöffneten Dateien des angegebenen Dateityps zu erleichtern.

Sie haben beispielsweise 1.xml, 2.xml, 3.xml und 4.xml und können Folgendes tun:

bd xml

dann drücken <c-a>

vim wird für Sie wie folgt automatisch vervollständigt:

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

Sie können einfach die Eingabetaste drücken, um den Befehl abzuschließen.

Wenn Sie Änderungen an einer der oben genannten Dateien vorgenommen haben, denken Sie daran:

bd! xml
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.