2012-02-22 12 views
22

In Vim, io spesso trovo a voler fare un rapido zk o zj per passare alla piega precedente o successivo in un file. Il problema è che spesso desidero saltare le tutte le pieghe aperte e saltare semplicemente alla piega chiusa più vicina.È possibile passare alle pieghe chiuse in Vim?

C'è un modo per farlo? Non vedo la keymap incorporata nel manuale.

risposta

22

Consentitemi di proporre i seguenti mapping che implementano il comportamento descritto.

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. Funziona come un fascino. Molte grazie! – David

+0

@ David: Grazie! Ho effettuato un refactoring sul codice per semplificare il loop di salto e mantenere il cursore in posizione se non c'è una piega chiusa nella direzione desiderata. (Quest'ultimo comportamento è conforme a quello dei comandi 'zj' /' zk' quando non è possibile trovare alcuna piega sotto/sopra.) –

+0

@ib. potresti fornire lo script modificato? –

-1

No, non esiste (per quanto ne so) un metodo build per farlo. Idea interessante, però.

Se ho avuto un po 'di tempo in questo momento, potrei cercare di capire un modo per farlo - sfortunatamente, essere occupato al giorno d'oggi tutto quello che posso suggerire è quello di guardare il Detecting a folded line or an incremental search domanda (in particolare la funzione foldclosed) e prova a fare una funzione da solo. Controllando ogni riga, se la piega è aperta, salta ... qualcosa seguendo queste linee.

Problemi correlati