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).


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)'))

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.