Lakukan set foldmethod=exprdan gunakan 'foldexpr'untuk mengatur ekspresi skrip vim yang akan menentukan titik awal lipat.
set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='
Ini terlihat lebih rumit daripada itu, karena kita tidak dapat dengan mudah menggunakan spasi di :set, tetapi dengan spasi, dan baris baru atau 2, sepertinya:
get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
\ ? '>1'
\ : '='
Gambaran
Pada dasarnya ini membandingkan kata pertama dari setiap baris dengan baris sebelumnya. Jika kata-katanya berbeda maka garis mulai lipatan >1,. Kalau tidak, ia akan mempertahankan tingkat lipatan yang sama =,.
Kemuliaan Rincian
set foldmethod=expr untuk memberitahu Vim untuk menggunakan ekspresi skrip vim untuk menentukan lipatan
'foldexpr' opsi menahan ekspresi skrip vim
- Mengevaluasi kondisi dengan terner yang kembali
>1ketika lipatan harus dimulai dan =ketika tingkat lipatan harus dilanjutkan
v:lnumadalah baris saat ini yang 'foldexpr'sedang berjalan untuk memperbarui lipatan
- Dapatkan konten baris saat ini (
v:lnum) dan baris sebelumnya ( v:lnum - 1) melaluigetline()
- Pisahkan setiap baris menjadi kata-kata melalui
split()
- Gunakan
get()untuk mendapatkan indeks pertama dari kata-kata yang baru dipisah
- Gunakan nilai default
''jika ada baris kosong. misalnyaget(words, 0, '')
- Bandingkan kata pertama dari baris saat ini dengan kata pertama dari baris sebelumnya di bagian kondisi terner
Catatan: metode ini mungkin memiliki beberapa masalah kinerja dengan dokumen yang sangat besar
Untuk bantuan lebih lanjut lihat:
:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(