ฉันจะตั้งค่าตัวเลือกต่อบัฟเฟอร์ ไม่ใช่แค่ต่อหน้าต่างได้อย่างไร

ฉันใช้ foldmethod=syntax สำหรับภาษาส่วนใหญ่ ปัญหาหนึ่งคือเมื่อเข้าสู่โหมดแทรก มันจะแยกวิเคราะห์ไวยากรณ์ใหม่และจะกำจัดสถานะของการพับหากมีการใช้วงเล็บ/วงเล็บเหลี่ยม/อื่นๆ ที่เปิดอยู่

มีวิธีแก้ไขที่นี่

http://vim.wikia.com/wiki/Keep_folds_closed_While_inserting_text

augroup folding
  autocmd!
  autocmd InsertEnter *
    \ if !exists('w:last_fdm') |
    \ let w:last_fdm=&foldmethod |
    \ setlocal foldmethod=manual |
    \ endif
  autocmd InsertLeave,WinLeave *
    \ if exists('w:last_fdm') |
    \ let &l:foldmethod=w:last_fdm |
    \ unlet w:last_fdm |
    \ endif

สิ้นสุดกลุ่มอัตโนมัติ

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

ฉันจะแก้ไขปัญหานี้ได้อย่างไร? ฉันสามารถตั้งค่าตัวเลือก foldmethod ต่อบัฟเฟอร์แทนเพื่อให้ใช้กับทุกหน้าต่างได้หรือไม่


vim
person fent    schedule 25.06.2014    source แหล่งที่มา
comment
ฉันขอแนะนำวิธี indent ที่น่าเชื่อถือกว่า สม่ำเสมอกว่า และประหยัดกว่าในการคำนวณได้ไหม   -  person romainl    schedule 25.06.2014


คำตอบ (2)


ตัวเลือก 'foldmethod' เป็นแบบต่อหน้าต่าง และไม่สามารถเปลี่ยนแปลงได้ ปัญหาคือ autocmd ของคุณแก้ไขเฉพาะค่าตัวเลือกของ หน้าต่างปัจจุบัน แต่คุณต้องการให้การประมวลผลเสร็จสิ้นสำหรับหน้าต่าง ทั้งหมด สามารถทำได้แม้ว่าจะเกี่ยวข้องมากกว่าก็ตาม

  • วนซ้ำผ่านหน้าต่างทั้งหมด: for winNr in range(1, winnr('$'))
  • แทนที่จะเป็น let w:last_fdm ให้ใช้ :call setwinvar()
  • ในทำนองเดียวกัน :setlocal สามารถแทนที่ด้วย :call setwinvar() ได้ โดยใช้สัญลักษณ์ &foldmethod พิเศษสำหรับตัวเลือก window-local

รหัสเป็นกลุ่ม:

function! s:InsertEnter()
  for n in range(1, winnr('$'))
    :call setwinvar(n, "last_fdm", getwinvar(n, "&foldmethod"))
    :call setwinvar(n, "&foldmethod", "manual")
  endfor
endfunction

function! s:InsertLeave()
  if exists('w:last_fdm')
    for n in range(1, winnr('$'))
      :call setwinvar(n, "&foldmethod", getwinvar(n, "last_fdm"))
    endfor
    unlet w:last_fdm
  endif
endfunction

augroup folding
  autocmd!
  autocmd InsertEnter * :call <SID>InsertEnter()
  autocmd InsertLeave,WinLeave * :call <SID>InsertLeave()
augroup END
person Ingo Karkat    schedule 25.06.2014

ใช้ setlocal แทน set เพื่อให้บัฟเฟอร์เฉพาะ

setlocal foldmethod=syntax

ลองดูที่ :help setlocal

person FDinoff    schedule 25.06.2014
comment
นั่นคือสิ่งที่ฉันใช้ ฉันได้อัปเดตคำถามด้วยรหัสที่ฉันใช้จากลิงก์ - person fent; 25.06.2014