最も古いバッファを自動的に閉じますか?


9

最近、多くのファイルを編集して、各ファイルを少し変更する必要がありました。各ファイルにアクセスするために、私はNERDtreeを参照し、次々とファイルを開きました。ファイルをどんどん開くと、メモリ使用量が大幅に増えていることに気づきました。vimを閉じると、多くのメモリが戻ってきました。

かなりの数のプラグインをインストールしていますが、メモリ使用量が大幅に増加した理由は、いくつかの編集後に開いたバッファの数が原因であると考えています。

vimが一度に開くことができるバッファーの数を制限し、編集時間に関して古いバッファーを自動的に閉じる方法はありますか?

回答:


5

症状を治療するのではなく、問題を解決しましょう。Vimは通常、大量のメモリを使用するべきではありません。問題を特定するのが最善です。犯人を見つけるのに役立ついくつかのヒント:

  • プラグインを無効にする(バイナリ検索を使用して高速化する)
  • ~/.vimrcダウンを減らして、問題があるかどうかを確認します
  • あなたを~/.vimrc完全に無効にするvim -u NONE

「vimrcファイルをデバッグするにどうすればよいですか?」も参照してください

プラグインでメモリのバグを見つけた場合は、プラグインの開発者に連絡してください。Vimでメモリのバグを見つけた場合は、エラーを再現する手順を記載したバグレポートを送信してください。見る:h bugs


+1; Vimで同時に膨大な数のバッファを開くことができるはずですが、それでも問題ありません。バッファを(ウィンドウまたは「タブ」で)表示していない限り、バッファはメモリにロードされません。
Martin Tournoij、2015

@Carpetsmoker、バッファ変数および設定は、バッファがウィンドウに表示されていない場合でも消えません。ピーターが示唆したように、プラグインが各バッファーの多くの情報を保存する場合、メモリーが浪費される可能性があります(エンドユーザーがバッファーでこれ以上何もしないことを考えると)。ところで:プラグインは、内のバッファに関連するデータを格納しない場合がありますb:variablesが、中にs:plugin[bufid]に好適なプラグインのメンテナがパブリック汚染していない場合はb: 、「名前空間」を。この場合、バッファを削除しても、関連するすべての変数/メモリが収集されるとは限りません。
Luc Hermitte、2015

5

以下はあなたの質問に答えるべきです。

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

これはプラグインにドロップされます。次に、使用方法を選択する必要があります。


3

編集時間に関して最も古いバッファを取得する方法はわかりませんが、代わりに、最も古い未編集のバッファを閉じてみることができます。何かのようなもの:

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))

1
Pythonは必要ありません。Vimで十分です::let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')+:exe 'bw '.join(buffers, ' ')
Luc Hermitte、2015

@LucHermitte確かに、それは必要性の問題ではありません。Vimscriptに慣れていないだけです。IIRC bwのヘルプでは、「自分が何をしているのかを理解していない限り」それを使用すべきではないと述べています。私はしません。:)
muru

古い習慣。私は常に使用して:bwおり、決して使用していません:bd。バッファからほとんどすべてを削除するポイントを見たことはありませんが、実際にはすべてを削除するわけではありません。
Luc Hermitte、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.