답변:
증상을 치료하지 말고 문제를 해결합시다. Vim은 일반적으로 많은 양의 메모리를 사용해서는 안됩니다. 문제를 분리하는 것이 가장 좋습니다. 범인을 찾는 데 도움이되는 몇 가지 팁 :
~/.vimrc
문제가 있는지 아래로 줄이십시오.~/.vimrc
통해 완전히 비활성화vim -u NONE
vimrc 파일을 어떻게 디버깅합니까?를 참조하십시오 .
플러그인으로 메모리 버그를 발견하면 플러그인 개발자에게 문의하십시오. Vim에서 메모리 버그를 발견하면 오류를 재현하는 단계가 포함 된 버그 보고서를 제출하십시오. 보다:h bugs
b:variables
하는 s:plugin[bufid]
경우 에 저장할 수 있습니다 . 이 경우 버퍼를 삭제한다고해서 모든 관련 변수 / 메모리가 반드시 수집되는 것은 아닙니다. b:
다음은 귀하의 질문에 답변해야합니다.
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
이것은 플러그인으로 드롭됩니다. 그런 다음 사용 방법을 선택해야합니다.
편집 시간과 관련하여 가장 오래된 버퍼를 얻는 방법을 모르겠지만 대신 가장 오래된 편집되지 않은 버퍼를 닫으려고 시도 할 수 있습니다. 다음과 같은 것 :
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()
노트:
vim.buffers
현재 세션에서 열린 모든 버퍼의 목록이므로 나열되지 않은 버퍼도 포함됩니다. 이 (가) 반환 한 목록과 다릅니다 :ls
.options['buflisted']
.options['modified']
버퍼가 수정되었는지 확인합시다.N
열려고하는 수정되지 않은 나열된 버퍼 수입니다.타임 스탬프를 얻는 방법을 배운 Luc Hermitte의 답변 덕분에 다음을 사용하여 가장 오래된 비활성 항목을 먼저 시작할 수 있습니다.
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))
:let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')
+:exe 'bw '.join(buffers, ' ')
bw
의 도움에 따르면 "무엇을하고 있는지 알지 못한다면"사용하지 말아야합니다. 난 아니야 :)
:bw
하고 결코 사용 하지 않습니다 :bd
. 버퍼에서 거의 모든 것을 삭제하는 지점을 보지 못했지만 실제로는 모든 것이 아닙니다.