Tự động đóng bộ đệm cũ nhất?


9

Tôi cần chỉnh sửa rất nhiều tệp gần đây cho một thay đổi nhỏ trong mỗi tệp. Để đến từng tệp, tôi duyệt qua NERDtree và mở hết tệp này đến tệp khác. Khi tôi mở càng nhiều tệp, tôi nhận thấy rằng việc sử dụng bộ nhớ của tôi tăng lên rất nhiều. Đóng vim cho tôi rất nhiều ký ức trở lại.

Tôi đã cài đặt khá nhiều plugin, nhưng tôi nghĩ rằng lý do khiến việc sử dụng bộ nhớ của tôi tăng mạnh là do số lượng bộ đệm tôi đã mở sau một vài lần chỉnh sửa.

Có cách nào để hạn chế số lượng bộ đệm mà vim cho phép mở cùng một lúc, tự động đóng bộ đệm cũ liên quan đến thời gian chỉnh sửa không?

Câu trả lời:


5

Hãy giải quyết vấn đề, không điều trị các triệu chứng. Vim thường không nên sử dụng một lượng lớn bộ nhớ. Nó sẽ là tốt nhất cô lập vấn đề. Một số mẹo để giúp tìm ra thủ phạm:

  • Vô hiệu hóa các plugin (sử dụng tìm kiếm nhị phân để làm cho nó nhanh hơn)
  • Giảm ~/.vimrcxuống của bạn để xem nếu có bất cứ điều gì trong đó là vấn đề
  • Vô hiệu hóa ~/.vimrchoàn toàn thông qua của bạnvim -u NONE

Xem thêm Làm cách nào để gỡ lỗi tệp vimrc của tôi?

Nếu bạn tìm thấy lỗi bộ nhớ với plugin thì hãy liên hệ với nhà phát triển plugin. Nếu bạn tìm thấy lỗi bộ nhớ với Vim thì hãy gửi báo cáo lỗi với các bước để tạo lại lỗi. Xem:h bugs


+1; có thể mở một bộ đệm mê cung trong Vim cùng một lúc mà vẫn tốt. Miễn là bạn không xem bộ đệm (trong cửa sổ hoặc "tab") thì nó không được tải trong bộ nhớ.
Martin Tournoij

@Carpetsmoker, các biến và cài đặt bộ đệm không biến mất khi bộ đệm không được hiển thị trong cửa sổ. Nếu một plugin lưu trữ nhiều thông tin cho mỗi bộ đệm, như Peter đề xuất, thì bộ nhớ có thể bị lãng phí (xem xét người dùng cuối sẽ không làm gì thêm với bộ đệm). BTW: Một plugin có thể không lưu trữ dữ liệu liên quan đến bộ đệm b:variablesnhưng trong trường s:plugin[bufid]hợp nếu người duy trì plugin thích không gây ô nhiễm b: "không gian tên" công khai . Trong trường hợp này, xóa bộ đệm sẽ không nhất thiết phải thu thập tất cả các biến / bộ nhớ liên quan.
Luc Hermitte

5

Sau đây sẽ trả lời câu hỏi của bạn.

function! s:SortTimeStamps(lhs, rhs)
  return a:lhs[1] > a:rhs[1] ? 1 
     \   a:lhs[1] < a:rhs[1] ? -1
     \                       : 0
endfunction

function! s:Close(nb_to_keep)
  let saved_buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')
  let times = map(copy(saved_buffers), '[(v:val), getftime(bufname(v:val))]')
  call filter(times, 'v:val[1] > 0')
  call sort(times, function('s:SortTimeStamps'))
  let nb_to_keep = min([a:nb_to_keep, len(times)])
  let buffers_to_strip = map(copy(times[0:(nb_to_keep-1)]), 'v:val[0]')
  exe 'bw '.join(buffers_to_strip, ' ') 
endfunction

" Two ways to use it
" - manually
command! -nargs=1 CloseOldBuffers call s:Close(<args>)
" - or automatically
augroup CloseOldBuffers
  au!
  au BufNew * call s:Close(g:nb_buffers_to_keep)
augroup END
" and don't forget to set the option in your .vimrc
let g:nb_buffers_to_keep = 42

Điều này là để được thả vào một plugin. Sau đó, bạn sẽ phải chọn cách sử dụng nó.


3

Tôi không chắc chắn làm thế nào để có được bộ đệm lâu đời nhất liên quan đến thời gian chỉnh sửa, nhưng thay vào đó, người ta có thể cố gắng đóng bộ đệm cũ nhất chưa được chỉnh sửa. Cái gì đó như:

function CloseLast ()
    python <<EOF
import vim
N = 10
listed_buffers = [b for b in vim.buffers if b.options['buflisted'] and not b.options['modified']]
for i in range (0, len (listed_buffers) - N):
    vim.command (':bd' + str (listed_buffers[i].number))
EOF
endfunction

autocmd BufNew * call CloseLast()

Ghi chú:

  • vim.bufferslà danh sách mọi bộ đệm được mở trong phiên hiện tại, do đó, nó cũng bao gồm các bộ đệm chưa niêm yết. Nó không giống như danh sách được trả về :ls.
  • Do đó, chúng ta phải lọc ra các bộ đệm bị ẩn hoặc bị xóa. Điều này có thể được kiểm tra bằng cách sử dụng options['buflisted'].
  • Tương tự, options['modified']cho phép chúng tôi kiểm tra nếu bộ đệm được sửa đổi.
  • N là số lượng bộ đệm chưa được sửa đổi, được liệt kê mà bạn muốn mở.

Nhờ câu trả lời của Luc Hermitte mà tôi đã học được cách lấy dấu thời gian, thay vào đó, bạn có thể sử dụng cách sau đây để loại bỏ trạng thái không hoạt động lâu đời nhất trước tiên:

listed_buffers = (b for b in vim.buffers if b.options['buflisted'] and not b.options['modified'])
oldest_buffers = sorted (listed_buffers, key = lambda b: eval('getftime("' + b.name + '")'))
for i in range (0, len (oldest_buffers) - N):
    vim.command (':bd' + str (oldest_buffers[i].number))

1
Bạn không cần trăn. Vim là quá đủ: :let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')+:exe 'bw '.join(buffers, ' ')
Luc Hermitte

@LucHermitte Đúng, nhưng đó không phải là câu hỏi cần thiết . Tôi chỉ không đủ quen thuộc với Vimscript. bwSự giúp đỡ của IIRC nói rằng bạn không nên sử dụng nó "trừ khi bạn biết bạn đang làm gì". Tôi không. :)
muru

Thói quen cũ. Tôi luôn luôn sử dụng :bw, và không bao giờ :bd. Tôi chưa bao giờ thấy quan điểm xóa hầu hết mọi thứ khỏi bộ đệm, nhưng thực tế không phải tất cả mọi thứ.
Luc Hermitte 25/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.