Beberapa metode lipat dalam vim

9

Saya menggunakan opsi lipat vim cukup banyak, dan biasanya telah menetapkan metode lipat ke sintaks. Baru-baru ini saya menemukan bahwa mungkin untuk menambahkan lipatan khusus, sehingga saya dapat meletakkan seluruh blok /*{{{*/dan /*}}}*/yang sangat berguna untuk mengelompokkan bagian besar file sumber secara bersamaan. Namun untuk menggunakan fitur itu saya perlu mengatur metode lipat ke penanda, dan saya kehilangan lipatan sintaks.

Apakah mungkin untuk memiliki dua metode lipat aktif pada saat yang sama dalam vim? set foldmethod=syntax,markertidak bekerja.

Bjarke Freund-Hansen
sumber

Jawaban:

4

Tidak, sebenarnya tidak mungkin memiliki beberapa metode lipat aktif di Vim secara bersamaan.

Anda dapat mengemulasi lipatan berbasis marker jika Anda ingin mempelajari cara menulis aturan penyorotan sintaks dan meretas file yang disorot untuk bahasa yang ingin Anda tambahkan emulasi lipat marker. Melakukannya memiliki beberapa kelemahan:

  1. Perintah untuk membuat / menghapus lipatan ("zf", "zd" dan seterusnya) yang bekerja dengan marker dan metode pelipatan manual tidak akan berfungsi ketika metode lipat diatur ke "sintaksis".

  2. Meniru penanda yang "memaksa" tingkat lipatan (mis. " {{{1" / " }}}1") Sebagai kebalikan dari menambah / mengurangi tingkat lipatan dengan satu (misalnya " {{{" / " }}}") bermasalah; baik Anda harus mengabaikan angka level lipatan sepenuhnya, atau mengambil kesempatan bahwa Anda akan mengganggu — dan mungkin melanggar — sisa aturan lipat berdasarkan sintaksis.

Saya menyarankan bahwa ketika Anda menemukan Anda perlu lipat berbasis marker, Anda menggunakan metode itu sepenuhnya. Mungkin butuh waktu dan usaha ekstra, tetapi jika Anda benar-benar membutuhkan fleksibilitas, itu mungkin sepadan, terutama mengingat kesulitan dalam mencoba menggabungkan keduanya.

Heptite
sumber
2

Saya mencari hal yang sama. Karena saya tidak ingin meretas file sintaks, alih-alih saya memiliki pemetaan untuk beralih di antara metode waktu. Saat ini saya hanya beralih antara sintaks dan marker:

nmap <Leader>ff :call <SID>ToggleFold()<CR>
function! s:ToggleFold()
    if &foldmethod == 'marker'
        let &l:foldmethod = 'syntax'
    else
        let &l:foldmethod = 'marker'
    endif
    echo 'foldmethod is now ' . &l:foldmethod
endfunction
idbrii
sumber