ปิดบัฟเฟอร์ที่เก่าที่สุดโดยอัตโนมัติหรือไม่


9

ฉันต้องการแก้ไขไฟล์จำนวนมากเมื่อเร็ว ๆ นี้เพื่อให้การเปลี่ยนแปลงเล็กน้อยในแต่ละไฟล์ ในการเข้าถึงแต่ละไฟล์ฉันเรียกดูผ่าน NERDtree และเปิดไฟล์หนึ่งไฟล์หลังจากนั้นอีกหนึ่งไฟล์ เมื่อฉันเปิดไฟล์มากขึ้นเรื่อย ๆ ฉันสังเกตว่าการใช้หน่วยความจำของฉันเพิ่มขึ้นเป็นจำนวนมาก เสียงเรียกเข้าปิดให้ฉันหน่วยความจำมากมายกลับ

ฉันติดตั้งปลั๊กอินค่อนข้างน้อย แต่ฉันคิดว่าเหตุผลที่การใช้งานหน่วยความจำของฉันเพิ่มขึ้นอย่างมากเนื่องจากจำนวนบัฟเฟอร์ที่ฉันเปิดหลังจากการแก้ไขไม่กี่ครั้ง

มีวิธี จำกัด จำนวนของบัฟเฟอร์ที่ vim ที่อนุญาตให้เปิดในครั้งเดียวโดยอัตโนมัติปิดบัฟเฟอร์เก่าที่เกี่ยวข้องกับการแก้ไขเวลาหรือไม่

คำตอบ:


5

ลองแก้ปัญหาไม่ใช่รักษาอาการ Vim ไม่ควรใช้หน่วยความจำจำนวนมาก มันจะแยกปัญหาได้ดีที่สุด เคล็ดลับที่จะช่วยค้นหาผู้กระทำผิด:

  • ปิดใช้งานปลั๊กอิน (ใช้การค้นหาแบบไบนารีเพื่อทำให้เร็วขึ้น)
  • ลดปัญหาของคุณ~/.vimrcลงเพื่อดูว่ามีอะไรในปัญหาหรือไม่
  • ปิดการใช้งานของคุณ~/.vimrcอย่างสมบูรณ์ผ่านทางvim -u NONE

ดูที่ฉันจะดีบักไฟล์ vimrc ของฉันได้อย่างไร

หากคุณพบข้อบกพร่องของหน่วยความจำด้วยปลั๊กอินให้ติดต่อผู้พัฒนาปลั๊กอิน หากคุณพบข้อบกพร่องของหน่วยความจำด้วย Vim ให้ส่งรายงานข้อผิดพลาดพร้อมขั้นตอนในการทำซ้ำข้อผิดพลาด ดู:h bugs


+1; มันควรจะเป็นไปได้ที่จะเปิดบัฟเฟอร์ gazillion ใน Vim ในเวลาเดียวกันและยังดี ตราบใดที่คุณไม่ได้ดูบัฟเฟอร์ (ในหน้าต่างหรือ "แท็บ") มันจะไม่โหลดในหน่วยความจำ
Martin Tournoij

@Carpetsmoker ตัวแปรบัฟเฟอร์และการตั้งค่าจะไม่หายไปเมื่อบัฟเฟอร์ไม่ปรากฏในหน้าต่าง หากปลั๊กอินจัดเก็บข้อมูลจำนวนมากสำหรับแต่ละบัฟเฟอร์ตามที่ Peter แนะนำไว้อาจทำให้เสียหน่วยความจำ (การพิจารณาว่าผู้ใช้ปลายทางจะไม่ทำอะไรกับบัฟเฟอร์มากขึ้น) BTW: ปลั๊กอินอาจไม่จัดเก็บข้อมูลที่เกี่ยวข้องกับบัฟเฟอร์ในb:variablesแต่ในs:plugin[bufid]ถ้าดูแลปลั๊กอินต้องการที่จะไม่ก่อให้เกิดมลพิษประชาชน"namespace"b: ในกรณีนี้การลบบัฟเฟอร์ไม่จำเป็นต้องรวบรวมตัวแปร / หน่วยความจำที่เกี่ยวข้องทั้งหมด
Luc Hermitte

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
คุณไม่ต้องการหลาม เสียงเรียกเข้ามีมากเกินพอ: :let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')+:exe 'bw '.join(buffers, ' ')
Luc Hermitte

@LucHermitte ทรู แต่มันไม่ได้เป็นคำถามของความต้องการ ฉันไม่คุ้นเคยกับ Vimscript มากพอ bwความช่วยเหลือของIIRC กล่าวว่าคุณไม่ควรใช้ "เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่" ฉันไม่. :)
muru

นิสัยเก่า ๆ ฉันมักจะใช้และไม่เคย:bw :bdฉันไม่เคยเห็นจุดลบเกือบทุกอย่างจากบัฟเฟอร์ แต่ไม่ใช่ทุกสิ่ง
Luc Hermitte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.