ฉันชอบการพับด้วยการเยื้อง แต่รวมถึงความคิดเห็นในการพับ (ฉันหมายถึงความคิดเห็นแต่ละรายการจะได้รับการพับในระดับเดียวกันกับบรรทัดก่อนหน้า)
น่าเสียดายที่คำหลัก foldignore ใช้งานได้กับความคิดเห็นหนึ่งบรรทัดเท่านั้น ดังนั้นฉันจึงพับ expr ด้วย vimrc:
set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)
function! FoldMethod(lnum)
"get string of current line
let crLine=getline(a:lnum)
" check if empty line
if empty(crLine) "Empty line or end comment
return -1 " so same indent level as line before
endif
" check if comment
let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
if a:data =~ ".*omment.*"
return '='
endif
"Otherwise return foldlevel equal to indent /shiftwidth (like if
"foldmethod=indent)
else "return indent base fold
return indent(a:lnum)/&shiftwidth
endfunction
บล็อกสุดท้าย:
indent(a:lnum)/&shiftwidth
ส่งคืนฐานระดับพับเมื่อเยื้อง
และอีกหนึ่ง:
join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
ตรวจสอบว่าอักขระตัวแรกของบรรทัดถูกพิจารณาว่าเป็นความคิดเห็นที่มีไวยากรณ์หรือไม่ ดังนั้นจึงเป็นวิธีที่ดีในการผสานการเยื้องและการพับไวยากรณ์ด้วยนิพจน์ซึ่งเป็นการพับขั้นสูงที่สุด
โปรดทราบว่าคุณยังสามารถ "ตั้งค่า foldtext" ขึ้นอยู่กับว่าคุณต้องการให้ผลลัพธ์เป็นอย่างไร