2009-10-07 8 views
38

Mam hordę buforów otwartych w vim, z których tylko kilka otwiera się w podzielonych oknach lub na innych zakładkach. Czy istnieje sposób, aby zamknąć wszystkie oprócz tych, które są obecnie widoczne w jednym z tych podziałów lub kart?Jak zamknąć wszystkie bufory, które nie są wyświetlane w oknie w vim?

+1

Dla porównania, stwierdzono, że ten gwint [Yahoo vim Group] (http://tech.groups.yahoo.com/group/vim/message/56425) zanim mogłaby się na to SO Pytania i odpowiedzi. Odpowiedzi są tutaj lepsze, ponieważ dotyczą stron kart. – atomicules

+1

Artem Nezvigin zaadaptował miriadę poniżej do wtyczki, [wipeout.vim] (http://www.vim.org/scripts/script.php?script_id=4882) –

Odpowiedz

21

Oto alternatywne rozwiązanie można upuścić w swojej .vimrc:

function! Wipeout() 
    " list of *all* buffer numbers 
    let l:buffers = range(1, bufnr('$')) 

    " what tab page are we in? 
    let l:currentTab = tabpagenr() 
    try 
    " go through all tab pages 
    let l:tab = 0 
    while l:tab < tabpagenr('$') 
     let l:tab += 1 

     " go through all windows 
     let l:win = 0 
     while l:win < winnr('$') 
     let l:win += 1 
     " whatever buffer is in this window in this tab, remove it from 
     " l:buffers list 
     let l:thisbuf = winbufnr(l:win) 
     call remove(l:buffers, index(l:buffers, l:thisbuf)) 
     endwhile 
    endwhile 

    " if there are any buffers left, delete them 
    if len(l:buffers) 
     execute 'bwipeout' join(l:buffers) 
    endif 
    finally 
    " go back to our original tab page 
    execute 'tabnext' l:currentTab 
    endtry 
endfunction 

Zastosowanie :call Wipeout().

+1

Czy to powoduje usunięcie zmodyfikowanych buforów? –

+0

Odpowiedź przez atomicules działa, ten usuwa bufory w kartach i wydaje się mieć dziwne zachowanie. –

+0

Ostrożnie - "Wipeout()" uważa okna w innych zakładkach (zakładki, które nie są aktualnie widoczną zakładką), aby były niewidoczne. – emallove

8

Dodaj to do Twojego .vimrc:

function! CloseHiddenBuffers() 
    let i = 0 
    let n = bufnr('$') 
    while i < n 
    let i = i + 1 
    if bufloaded(i) && bufwinnr(i) < 0 
     exe 'bd ' . i 
    endif 
    endwhile 
endfun 

Następnie można zrobić, aby zamknąć ukryte bufory:

:call CloseHiddenBuffers() 

(Prawdopodobnie będziesz chciał związać klucza lub polecenia do niego .)

Aktualizacja:

Tutaj s wersja zaktualizowana do obsługi stron kart. (Sam nie używam stron tabulacji, więc nie zdawałem sobie sprawy, że bufwinnr działa tylko dla okien na bieżącej stronie).

function! CloseHiddenBuffers() 
    " figure out which buffers are visible in any tab 
    let visible = {} 
    for t in range(1, tabpagenr('$')) 
    for b in tabpagebuflist(t) 
     let visible[b] = 1 
    endfor 
    endfor 
    " close any buffer that's loaded and not visible 
    for b in range(1, bufnr('$')) 
    if bufloaded(b) && !has_key(visible, b) 
     exe 'bd ' . b 
    endif 
    endfor 
endfun 
+0

Mogłem źle sformułować moje pytanie. m próbuje wyczyścić wyjście ': ls', a ta funkcja nie wydaje się tego robić. –

+0

Czy to był brak wsparcia na karcie, czy coś innego? Dodałem wersję obsługującą strony z kartami powyżej. –

+0

To nadal nie działa dla mnie. –

3

Wiem, dlaczego drugi skrypt nie działa poprawnie.

Jest to spowodowane funkcją bufloaded(), która musi być bufexits()!

Rzeczywiście, bufor do usunięcia nie został załadowany! Po prostu usuń ten warunek jest w porządku, ale robi pewne ostrzeżenie, gdy próbujemy wymazać bufor, który nie jest używany, więc musimy użyć bufexists (b).

Ostateczne rozwiązanie jest następujące:

function! CloseHiddenBuffers() 
    " Tableau pour memoriser la visibilite des buffers                      
    let visible = {} 
    " Pour chaque onglet... 
    for t in range(1, tabpagenr('$')) 
     " Et pour chacune de ses fenetres... 
     for b in tabpagebuflist(t) 
      " On indique que le buffer est visible. 
      let visible[b] = 1 
     endfor 
    endfor 
    " Pour chaque numero de buffer possible... 
    for b in range(1, bufnr('$')) 
     " Si b est un numero de buffer valide et qu'il n'est pas visible, on le 
     " supprime. 
     if bufexists(b) && !has_key(visible, b) 
      " On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui 
      " sont pourtant charges en memoire. 
      execute 'bwipeout' b 
     endif 
    endfor 
endfun 

Dzięki tobie.

+0

Jeśli "bufloaded (b)" ma wartość false dokładnie dla buforów, które chcemy zamknąć, dlaczego nie po prostu "if! Bufloaded (b)"? – derenio

+0

Zrobiłem to, ale ja lubię: Wipeout bardzo chwytliwe 'polecenie! -nargs =? Wipeout call CloseHiddenBuffers() ' – expelledboy

24

Jeszcze inne podejście do tego. Korzystając z przykładu podanego w pomocy Vima dla tabpagebuflist(), uzyskaj listę buforów wyświetlanych w karcie lub oknie. Mam poniżej w moim .vimrc

function! DeleteInactiveBufs() 
    "From tabpagebuflist() help, get a list of all buffers in all tabs 
    let tablist = [] 
    for i in range(tabpagenr('$')) 
     call extend(tablist, tabpagebuflist(i + 1)) 
    endfor 

    "Below originally inspired by Hara Krishna Dara and Keith Roberts 
    "http://tech.groups.yahoo.com/group/vim/message/56425 
    let nWipeouts = 0 
    for i in range(1, bufnr('$')) 
     if bufexists(i) && !getbufvar(i,"&mod") && index(tablist, i) == -1 
     "bufno exists AND isn't modified AND isn't in the list of buffers open in windows and tabs 
      silent exec 'bwipeout' i 
      let nWipeouts = nWipeouts + 1 
     endif 
    endfor 
    echomsg nWipeouts . ' buffer(s) wiped out' 
endfunction 
command! Bdi :call DeleteInactiveBufs() 
+0

To zepsuje CommandT. Otrzymuję "Vim :: DeletedBufferError: próba odwołania się do usuniętego bufora" przy pierwszym uruchomieniu CommandT po uruchomieniu Bdi. Następnym razem, gdy spróbuję keybinding CommandTs, nic się nie dzieje i kilka innych moich klawiszy przestaje działać. – bobpaul

+0

@bobpaul Nie używam CommandT, ale możesz spróbować użyć 'bdelete' zamiast' bwipeout' w funkcji. To może bardziej zdenerwować CommandT. – atomicules

+0

Cześć atomic, próbuję twojej funkcji, i dostaję masę błędów takich jak to: http://trusktr.io:7777/isowiyirid.rb. Jakieś pomysły? – trusktr

Powiązane problemy