2012-02-22 23 views
22

Vim, ben sık sık kendimi bir dosyada önceki veya sonraki kat atlamak için hızlı z'dek veya zj yapmak isteyen bulabilirsiniz. Sorun şu ki, sık sık tüm açık kıvrımları atlamak ve sadece en yakın kapalı kata atlamak istiyorum.Vim'deki kapalı katlara atlamak mümkün mü?

Bunu yapmanın bir yolu var mı? Kılavuzda yerleşik bir keymap göremiyorum.

cevap

22

Tanımlanan davranışı uygulayan aşağıdaki eşleştirmeleri önereyim.

nnoremap <silent> <leader>zj :call NextClosedFold('j')<cr> 
nnoremap <silent> <leader>zk :call NextClosedFold('k')<cr> 
function! NextClosedFold(dir) 
    let cmd = 'norm!z' . a:dir 
    let view = winsaveview() 
    let [l0, l, open] = [0, view.lnum, 1] 
    while l != l0 && open 
     exe cmd 
     let [l0, l] = [l, line('.')] 
     let open = foldclosed(l) < 0 
    endwhile 
    if open 
     call winrestview(view) 
    endif 
endfunction 
+0

Awesomeness. ÇALIŞIYOR bir cazibe gibi. Çok teşekkürler! – David

+0

@David: Teşekkürler! Ben atlama döngüsünü basitleştirmek ve istenen yönde kapalı bir katlama yok ise imleci yerinde tutmak için kod üzerinde bir refactoring yaptım. (Üst/altta hiçbir katlama bulunamadığında ikinci davranış, 'zj' /' zk' komutlarına uygundur.) –

+0

@ib. değiştirilen senaryoyu verebilir misiniz? –

-1

Hayır, (bildiğim kadarıyla) bunu yapmanın bir yönteminde yoktur. İlginç bir fikir olsa da.

ben şu anda biraz zaman olsaydı, bunu yapmak için bir yol bulmaya çalışabilir - Bugünlerde meşgul olmak, maalesef tek istediğim Detecting a folded line or an incremental search soru (özellikle foldclosed fonksiyonu) bakmaktır önerebilirsiniz ve kendiniz bir işlev yapmaya çalışın. Katlama açıksa, her satırı kontrol edin ... bu satırlardaki bir şeyi atlayın.