Bagaimana saya bisa mengatur foldlevelstart dalam vim untuk hanya melipat tidak ada pada awalnya, masih memungkinkan zr untuk segera bekerja?

8

Dalam vim, saya biasanya diatur foldmethoduntuk indentuntuk sebagian besar jenis file. Secara umum, saya suka file dibuka dengan semua lipatan terbuka. Namun, penting untuk segera mulai menggunakan zmuntuk mulai menutup lipatan secara global di seluruh file, satu tingkat pada suatu waktu, memungkinkan saya untuk melihat keseluruhan struktur file tanpa detail yang menghalangi.

Satu-satunya solusi umum yang saya temukan adalah mengatur foldlevelstartke angka yang sangat tinggi, misalnya 99, untuk memastikan bahwa semua file (dengan mengingat file yang berbeda akan memiliki tingkat indentasi maksimum yang berbeda) mulai dibuka sepenuhnya. Namun, saya kemudian harus menggunakan zmberulang kali untuk mengurangi foldlevelke tingkat lipatan maksimum file, biasanya jauh lebih sedikit dari 99, yang rumit dan tidak praktis. Saya dapat mengatur foldlevelsecara manual menggunakan baris perintah vim, tetapi saya masih perlu mengetahui indentasi maksimum dalam file.

Apakah ada cara praktis untuk membuka file dengan foldlevelset ke tepat satu lebih dari level indent / fold maksimum saat ini dalam file itu sendiri?

Misalnya, diberikan file berikut:

a
  b
    c
      d1
      d2
    e
      f1
      f2

Tekan tombol pertama zmakan menunjukkan ini:

a
  b
    c
+--  2 lines: d1------
    e
+--  2 lines: f1------

(Namun, perlu diketahui bahwa ini harus berfungsi untuk kasus umum di mana indentasi maksimum awal file dapat berupa nilai apa pun).

Andrew Ferrier
sumber
1
Anda bingung zrdengan zm; yang terakhir mengurangi tingkat lipat.
Ingo Karkat
@IngoKarkat, Anda benar, saya. Maaf atas kebingungan - Saya selalu menemukan kombo kunci itu kontra-intuitif. Saya telah memperbaiki pertanyaan saya.
Andrew Ferrier
"Aku selalu menemukan kombo kunci itu kontra-intuitif." Seharusnya berarti zm= lipat lebih banyak (kurangi foldlevel) dan zr= lipat lebih sedikit (add foldlevel)
wisbucky

Jawaban:

9

Ini menemukan tingkat lipat tertinggi dalam file saat ini:

:let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))

Untuk mengatur ini secara otomatis, Anda dapat menggunakan :autocmd:

:autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))
Ingo Karkat
sumber
1
Ingo, sempurna, itulah yang saya cari. Terima kasih. Rasa malu foldlevelstarttidak memiliki opsi seperti ini.
Andrew Ferrier
Ini sepertinya tidak berfungsi pada Cygwin Vim. Saya foldleveladalah 0 dan foldlevelstart-1 ketika saya meluncurkan file dengan pengaturan itu.
CMCDragonkai
0

Alih-alih menggunakan zr, gunakan zR, yang akan membuka semua lipatan. Demikian pula, zMakan menutup semua lipatan.

garyjohn
sumber
Gary, terima kasih. Itu dekat, tetapi tidak melakukan apa yang saya jelaskan. Saya ingin perintah yang mengurangi tingkat lipatan hanya satu, tetapi dari tingkat lipatan maksimum yang relevan dengan file yang dimaksud. Untuk melakukan itu, saya harus menggunakan zM untuk mengurangi foldlevel ke 0, lalu zr berulang kali untuk membuka lebih banyak detail. Saya mencari satu kombinasi perintah / tombol.
Andrew Ferrier
2
Anda bisa melakukannya zR(atur foldlevel ke level tertinggi) lalu zmakan berhasil. Itu hanya satu langkah ekstra.
wisbucky
0

Opsi ini set nofoldenablememungkinkan Anda memulai file dengan semua lipatan terbuka

HarshaNadimpalli
sumber
Bukan itu pertanyaan saya. Saya ingin lipatan diaktifkan.
Andrew Ferrier