2011-07-01 37 views
15

Tôi có khoảng 120 bộ đệm mở trong Vim ngay bây giờ. Khoảng 50% bộ đệm này là các tệp trống. Tôi muốn bằng cách nào đó sử dụng bufdo! để đóng tất cả các vùng đệm trống. Có cách nào tôi có thể nói:Xóa tất cả bộ đệm trống trong VIM

bufdo! (something) 

đâu (something) là một lệnh có điều kiện mà bdelete là bộ đệm hiện NẾU chiều dài/kích thước của bộ đệm đó là zero?

+0

Lưu ý rằng lệnh ': bufdo'-argument không được thêm hoặc xóa bộ đệm (xem': help: bufdo'). –

Trả lời

6

Điều duy nhất mà tôi có thể nghĩ đến là tạo một hàm báo cáo nếu bộ đệm trống hay không. Một cái gì đó như thế này:

function! BufferIsEmpty() 
    if line('$') == 1 && getline(1) == '' 
     return 1 
    else 
     return 0 
    endif 
endfunction 

" Test it like this: 
echo BufferIsEmpty() 
+2

Điều kiện tương tự: 'line2byte (dòng (" $ ") + 1) <= 2'. – ZyX

+0

@ZyX: Tại sao không phải 'line2byte (line ('$')) <2'? –

+0

@ib 'vim -u NONE -N -c 'gọi setline (". "," Abc ") | echo line2byte (dòng ("$")) '' – ZyX

12

Vì nó không được phép làm ảnh hưởng đến danh sách đệm với một :bufdo lệnh -argument (xem :help :bufdo), chúng ta phải sử dụng nhiều dài dòng nhưng khá đơn giản kịch bản Vim.

Hàm dưới đây liệt kê tất cả các số đệm hiện và xóa những người mà không có một tên (hiển thị như [No Name] trong giao diện ) và bất kỳ thay đổi chưa được lưu. (Sau này được đảm bảo bởi lệnh :bdelete, mà không có dấu hiệu !, không xóa bộ đệm đã sửa đổi).

function! DeleteEmptyBuffers() 
    let [i, n; empty] = [1, bufnr('$')] 
    while i <= n 
     if bufexists(i) && bufname(i) == '' 
      call add(empty, i) 
     endif 
     let i += 1 
    endwhile 
    if len(empty) > 0 
     exe 'bdelete' join(empty) 
    endif 
endfunction 

Nếu bạn muốn xoá bộ đệm rỗng hoàn toàn, bao gồm bốc dỡ người, xem xét (cẩn thận!) Thay thế bdelete với bwipeout (xem :help :bd, :help :bw).

Để kiểm tra nội dung của bộ đệm cần xóa, hãy sử dụng chức năng getbufline(). Ví dụ: để chắc chắn rằng bộ đệm không chứa văn bản trong đó, hãy sửa đổi câu lệnh if bên trong vòng lặp while như sau.

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == [''] 

Lưu ý rằng bufexists() được đổi thành bufloaded() tại đây. Nó là cần thiết vì chỉ có thể lấy nội dung của những bộ đệm được tải (đối với bộ đệm chưa tải getbufline() trả về danh sách trống bất kể nội dung của chúng).

9

Tôi đã sử dụng các chức năng sau đây để thực hiện công việc:

function! s:CleanEmptyBuffers() 
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")') 
    if !empty(buffers) 
     exe 'bw ' . join(buffers, ' ') 
    endif 
endfunction 

Nó rất giống với của IB phiên bản ngoại trừ việc nó rời khỏi đệm QuickFix một mình (miễn là bất kỳ bộ đệm trống khác được hiển thị trong một cửa sổ)

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