Lakukan set foldmethod=expr
dan 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
>1
ketika lipatan harus dimulai dan =
ketika tingkat lipatan harus dilanjutkan
v:lnum
adalah 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(