2012-02-22 11 views
22

En Vim, que con frecuencia me encuentro con ganas de hacer una rápida zk o zj para saltar al redil anterior o siguiente en un archivo. El problema es que con frecuencia quiero omitir todos los pliegues abiertos, y simplemente saltar al doblez cerrado más cercano.¿Es posible saltar a pliegues cerrados en Vim?

¿Hay alguna manera de hacerlo? No veo ningún mapa de teclas incorporado en el manual.

Respuesta

22

Déjenme proponer las siguientes asignaciones que implementan el comportamiento descrito.

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. Funciona de maravilla. ¡Muchas gracias! – David

+0

@David: ¡Gracias! He hecho una refactorización en el código para simplificar el circuito de salto y para mantener el cursor en su lugar si no hay un plegado cerrado en la dirección deseada. (Este último comportamiento se ajusta al de los comandos 'zj' /' zk' cuando no se puede doblar debajo/arriba). –

+0

@ib. ¿Podrías por favor proporcionar el script modificado? –

-1

No, no hay (hasta donde yo sé) una compilación en el método para hacerlo. Interesante idea, sin embargo.

Si tuviera algún tiempo en este momento, podría tratar de encontrar una manera de hacerlo - desafortunadamente, estar ocupado hoy en día todo lo que puedo sugerir que es mirar el Detecting a folded line or an incremental search pregunta (sobre todo la función foldclosed) y trata de hacer una función tú mismo. Verificando cada línea, si el doblez está abierto, omita ... algo en esa línea.

Cuestiones relacionadas