2011-08-11 11 views
7

¿Puede hacer que Vim expanda un pliegue automáticamente cuando el cursor lo toca?¿Hay alguna manera de expandir un plegado de Vim automáticamente cuando colocas el cursor sobre él?

+1

Por qué lo hizo aceptas la respuesta de Eelvex y no la mía? No solo propuse esta solución (y su versión aún más elegante, 'au CursorMoved, CursorMovedI * sil! Foldo') * anterior *, ya que es obvio desde el historial de revisiones, sino que también desarrolló la manera de resolver el problema de forma más consistente. –

+0

Lo siento. No recuerdo por qué lo hice. Fijo. – dan

Respuesta

4

Consulte la opción foldopen. Controla qué grupos de comandos conducirán a abriendo un pliegue si el cursor se mueve hacia un pliegue cerrado.

Tenga en cuenta que los movimientos verticales no abren un doblez cerrado, sin embargo. Además, no hay configuración en foldopen para permitir este comportamiento. Cuando el artículo hor es configurado en la opción foldopen, para abrir un pliegue se puede usar h, l u otros comandos de movimiento horizontal . En caso de que si es crucial abrir automáticamente un pliegue en cualquier movimiento del cursor que lo toque, uno puede abordar este problema reasignando algún subconjunto de comandos de movimiento vertical como se muestra a continuación.

nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr> 
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr> 
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr> 
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr> 
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr> 
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr> 
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr> 
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr> 
function! MoveUpDown(cmd, dir, ndef) 
    let n = v:count == 0 ? eval(a:ndef) : v:count 
    let l = line('.') + a:dir * n 
    silent! execute l . 'foldopen!' 
    execute 'norm! ' . n . a:cmd 
endfunction 

un ser inferior, pero un poco más económica solución sería abrir un pliegue en cada movimiento del cursor .

autocmd CursorMoved,CursorMovedI * silent! foldopen 

Desafortunadamente, esta solución no es general. Después de abrir el pliegue debajo del cursor , el cursor se posiciona en la primera línea de ese pliegue. Si este comportamiento es indeseable, se puede seguir la dirección vertical de un movimiento y colocar el cursor en la última línea del doblez cuando el cursor se mueve de abajo arriba.

autocmd CursorMoved,CursorMovedI * call OnCursorMove() 
function! OnCursorMove() 
    let l = line('.') 
    silent! foldopen 
    if exists('b:last_line') && l < b:last_line 
     norm! ]z 
    endif 
    let b:last_line = l 
endfunction 

Sin embargo, no se abrirá un pliegue si el movimiento salta por encima de la tapa. Para el ejemplo , 2j en la línea justo arriba de un pliegue colocará el cursor en la línea justo después de ese pliegue, no en la segunda línea.

+0

Vuelva a colocar la solución 'CursorMoved' de las revisiones anteriores. –

1

:help fdo y posiblemente :help fcl pueden ayudarlo. Tengo esta línea en mi .vimrc:

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo 
3
set foldopen=all 

parece hacer lo que quiera. También puede hacer una AutoCommand para el movimiento del cursor:

au CursorMoved * call AutoOpen() 

llamar a una función como:

function! AutoOpen() 
    if foldclosed(".") == line(".") 
    call feedkeys("zo") 
    endif 
endfunction 

Si quieres que esto funcione también en el modo de inserción, utilice:

au CursorMoved,CursorMovedI * call AutoOpen() 
+0

Desafortunadamente, este enfoque tiene inconvenientes (ver mi respuesta). –

+0

@ib: Sé que no es perfecto, pero no entiendo los inconvenientes. ¿Puedes elaborar? Gracias. – Eelvex

+0

Es obvio (y ya se describió en mi respuesta, por cierto).Mueva el cursor a la línea al lado de un pliegue cerrado y mueva una línea hacia arriba (con 'k', por ejemplo). Se abrirá el doblez y el cursor pasará a estar en la primera línea de ese doblez, no en el último, como debería ser lógicamente (es decir, la semántica del movimiento vertical línea por línea). Para ver otra desventaja, coloque el cursor en la línea justo arriba de un pliegue cerrado y escriba '2j'. El cursor saltará sobre el pliegue completo, se moverá no dos líneas hacia abajo, sino tantas líneas como tenga el doblez. –

Cuestiones relacionadas