ทำset foldmethod=expr
และใช้'foldexpr'
เพื่อตั้งค่านิพจน์สคริปต์กลุ่มที่จะกำหนดจุดเริ่มต้นการพับ
set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='
สิ่งนี้ดูซับซ้อนกว่าที่เป็นเพราะเราไม่สามารถใช้ช่องว่างได้ง่าย:set
แต่ด้วยช่องว่างและขึ้นบรรทัดใหม่หรือ 2 ดูเหมือนว่า:
get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
\ ? '>1'
\ : '='
ภาพรวม
โดยทั่วไปสิ่งนี้จะเปรียบเทียบคำแรกของแต่ละบรรทัดกับบรรทัดก่อนหน้า >1
หากคำที่มีความแตกต่างกันแล้วบรรทัดคือการเริ่มต้นของการพับ ไม่เช่นนั้นมันจะรักษาระดับการพับเหมือนเดิม, =
.
ความรุ่งเรืองของรายละเอียด
set foldmethod=expr
เพื่อบอกให้ Vim ใช้นิพจน์สคริปต์ vim เพื่อกำหนดการพับ
'foldexpr'
ตัวเลือกถือนิพจน์สคริปต์เป็นกลุ่ม
- การประเมินสภาพด้วยไตรภาคที่ส่งกลับ
>1
เมื่อพับควรเริ่มต้นและ=
เมื่อระดับการพับควรดำเนินการต่อ
v:lnum
เป็นบรรทัดปัจจุบันที่'foldexpr'
ใช้งานเพื่ออัปเดตการพับ
- รับเนื้อหาบรรทัดปัจจุบัน (
v:lnum
) และบรรทัดก่อนหน้า ( v:lnum - 1
) ผ่านgetline()
- แยกแต่ละบรรทัดออกเป็นคำทาง
split()
- ใช้
get()
เพื่อรับดัชนีแรกของคำที่แยกใหม่
- ใช้ค่าเริ่มต้นเป็น
''
กรณีบรรทัดว่าง เช่นget(words, 0, '')
- เปรียบเทียบคำแรกของบรรทัดปัจจุบันกับคำแรกของบรรทัดก่อนหน้าในส่วนเงื่อนไขของไตรภาค
หมายเหตุ: วิธีนี้อาจมีปัญหาประสิทธิภาพการทำงานกับเอกสารที่มีขนาดใหญ่มาก
สำหรับความช่วยเหลือเพิ่มเติมดู:
:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(