Apakah ada cara untuk menggunakan beberapa metode lipat vim sekaligus?


14

Saya telah foldmethod=indentmengatur di saya ~/.vimrc, dan secara umum itu bekerja untuk saya dan saya ingin menyimpannya.

Namun, ada beberapa file yang saya miliki yang saya edit secara teratur (dan yang berada di bawah kendali eksklusif saya), di mana saya ingin menambahkan dalam sistem berbasis penanda, khususnya sehingga ketika saya membuka file itu bagian besar saya jarang melihat (yang sudah 'dibatasi' oleh indentasi) dilipat sebelumnya. Sepertinya foldmethod=markerakan memungkinkan saya untuk melakukan itu (saya tidak keberatan komentar aneh di file untuk menunjukkan ini 'pra-lipatan' jika diperlukan), tapi aku masih ingin foldmethod=indentmengatur sehingga saya dapat menggunakan zc, zodan sebagainya untuk kemudian lipat atau buka bagian dengan indentasi. Sejauh yang saya tahu saya tidak bisa mengatur foldmethod ke beberapa nilai.

Apakah ada cara lain saya bisa mencapai ini (idealnya menggunakan sesuatu yang tertanam dalam file itu sendiri)?


Saya juga mencoba untuk membuat kedua metode lipat penanda dan indentasi bekerja pada saat yang sama. Saya juga percaya bahwa menggunakan ekspresi lipatan adalah pilihan terbaik. Apakah Anda menemukan ekspresi yang cocok dengan inden dan marker?
Jp_

1
@Jp_ nggak, 'tidak takut.
Andrew Ferrier

Jawaban:


10

Setiap jendela dapat memiliki nilai lokalnya sendiri yaitu 'foldmethod'; apa yang Anda setel ~/.vimrchanyalah standar global. Ada beberapa cara untuk menetapkan nilai lokal yang berbeda untuk buffer tertentu :

  1. Secara manual dengan :setlocal foldmethod=marker
  2. Untuk jenis file tertentu (misalnya file Java): :autocmd FileType java setlocal foldmethod=marker(atau dalam ~/.vim/after/ftplugin/java.vim)
  3. Untuk file tertentu: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Di dalam file itu sendiri melalui modeline (karena Anda harus menambahkan penanda, saya lebih suka ini):

/* vim: set fdm=manual : */

Masih ada hanya satu metode lipat di dalam satu jendela. Jika Anda ingin menggunakan strategi yang berbeda, Anda harus memilih metode yang lebih fleksibel (misalnya expr), dan menerapkan kembali metode "lain" di sana (misalnya dengan membuat Anda 'foldexpr'mempertimbangkan indentasi). Atau Anda menggunakan dua celah jendela untuk buffer yang sama, dan mengatur metode lipat yang berbeda untuk setiap pemisahan.

Karena itu mungkin bukan yang ingin Anda dengar, Anda bisa meretas sesuatu bersama dengan :autocmd CursorMovedyang mengganti metode lipat berdasarkan baris saat ini:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
Terima kasih. Jadi ini memberitahu saya bahwa saya dapat mengatur metode lipat ke penanda di dalam buffer itu. Tapi apa yang saya cari adalah sesuatu yang masih memungkinkan saya untuk menggunakan foldmethod indent, sementara memiliki beberapa bagian (yang sedang dipisahkan oleh indent) pra-dilipat. Jika saya melakukan (4) di atas, zc, zo, dan sebagainya tidak akan berfungsi lagi sebagaimana dimaksud dalam buffer itu. Saya sudah mengklarifikasi pertanyaan saya.
Andrew Ferrier

Pertanyaan Anda tidak jelas dalam aspek itu, terima kasih atas klarifikasi. Saya telah mengubah jawaban saya.
Ingo Karkat

Ya, maaf jika saya tidak jelas. Foldexpr terdengar seperti pendekatan terbaik tetapi juga rumit. Saya akan mencobanya. +1 untuk penunjuk.
Andrew Ferrier

Terima kasih lagi. Saya telah mencoba untuk menulis foldexpr dan membuka Q terkait di sini yang mungkin menarik: superuser.com/questions/560167/...
Andrew Ferrier

@IngoKarkat: Pada paragraf pertama di bawah baris Anda menulis bahwa hanya ada satu metode lipat per buffer . Saya percaya itu harus per jendela .
garyjohn
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.