2009-10-07 37 views
38

Tôi có một loạt các bộ đệm mở trong vim, chỉ có một vài trong số chúng mở trong cửa sổ phân tách hoặc trên các tab khác. Có cách nào để đóng tất cả nhưng những cái hiện có thể nhìn thấy trong một trong các phần tách hoặc tab đó không?Làm cách nào để đóng tất cả các bộ đệm không được hiển thị trong cửa sổ trong vim?

+1

Để tham khảo, tôi thấy điều này [Yahoo Vim Nhóm thread] (http://tech.groups.yahoo.com/group/vim/message/56425) trước khi tôi đi qua này SO Q & A. Câu trả lời ở đây là tốt hơn vì chúng xử lý các trang tab. – atomicules

+1

Artem Nezvigin đã điều chỉnh các giải pháp vô số dưới đây thành một plugin, [wipeout.vim] (http://www.vim.org/scripts/script.php?script_id=4882) –

Trả lời

21

Dưới đây là một giải pháp thay thế, bạn có thể thả trong .vimrc của bạn:

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 

Sử dụng :call Wipeout().

+1

Thao tác này có xóa bộ đệm đã sửa đổi không? –

+0

câu trả lời bằng các atomicules hoạt động, cái này xóa các bộ đệm trong các tab và có vẻ có hành vi kỳ quặc. –

+0

Cẩn thận - 'Wipeout()' xem xét các cửa sổ trong các tab khác (các tab không phải là tab hiện có) để ẩn. – emallove

8

Thêm này để vimrc của bạn:

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 

Sau đó, bạn có thể làm điều này để đóng bộ đệm ẩn:

:call CloseHiddenBuffers() 

(Bạn có thể sẽ muốn để ràng buộc một phím hoặc một lệnh để nó .)

cập nhật:

đây' Một phiên bản được cập nhật để hỗ trợ các trang tab. (Tôi không sử dụng các trang tab mình, vì vậy tôi đã không nhận ra rằng bufwinnr chỉ hoạt động cho các cửa sổ trên trang hiện tại).

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

Tôi có thể đã đặt sai câu hỏi của tôi không chính xác — tôi ' m cố gắng để làm sạch đầu ra của ': ls' và chức năng này dường như không làm điều đó. –

+0

Đó có phải là sự thiếu hỗ trợ tab-page, hay cái gì khác? Tôi đã thêm một phiên bản hỗ trợ các trang tab, ở trên. –

+0

Điều này vẫn không hiệu quả đối với tôi. –

3

Tôi biết lý do tập lệnh thứ hai không hoạt động chính xác.

Điều này là do hàm bufloaded() phải là bufexits()!

Thật vậy, bộ đệm cần xóa không được tải! Chỉ cần loại bỏ tình trạng này là okay nhưng nó đang làm một số cảnh báo khi chúng tôi đang cố gắng để quét sạch một bộ đệm không được sử dụng vì vậy chúng tôi phải sử dụng bufexists (b).

Giải pháp cuối cùng là như sau:

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 

Nhờ bạn.

+0

Nếu "bufloaded (b)" là sai cho chính xác các bộ đệm chúng tôi muốn đóng, tại sao không chỉ "nếu! Bufloaded (b)"? – derenio

+0

Điều này đã làm các trick, và tôi khá giống như: Wipeout rất hấp dẫn 'lệnh! -nargs =? Cuộc gọi Wipeout CloseHiddenBuffers() ' – expelledboy

24

Một tính năng khác nữa. Sử dụng ví dụ được đưa ra trong trợ giúp Vim cho tabpagebuflist() để có danh sách các bộ đệm xuất hiện trong tab hoặc cửa sổ. Tôi có dưới đây trong tôi .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

Điều này ngắt CommandT. Tôi nhận được "Vim :: DeletedBufferError: cố gắng để tham khảo bộ đệm đã xóa" lần đầu tiên tôi kích hoạt CommandT sau khi chạy Bdi. Lần sau, tôi thử keybinding CommandTs, không có gì xảy ra cả và một số keybindings khác của tôi cũng ngừng hoạt động. – bobpaul

+0

@bobpaul Tôi không sử dụng CommandT, nhưng bạn có thể thử sử dụng 'bdelete' thay vì' bwipeout' trong hàm. Điều đó có thể làm giảm CommandT ít hơn. – atomicules

+0

Hi nguyên tử, tôi đang thử chức năng của bạn, và tôi nhận được một loạt các lỗi như thế này: http://trusktr.io:7777/isowiyirid.rb. Bất kỳ ý tưởng? – trusktr

0

Có một plugin thực hiện chính xác này và thêm một chút!

Check-out close-buffers.vim

Các vấn đề liên quan