2010-06-23 10 views
5

He leído :help scroll-cursor y realmente me gusta zz, que coloca la línea en la que se encuentra el cursor en el medio de la ventana.Desplazamiento de Vim relativo al cursor, asignación personalizada

Estoy buscando ayuda para hacer un mapeo que se realice de forma similar a zz pero pone la línea en la que mi cursor está al 20% de la altura de la ventana (o 25%, 30% etc.).


Editar:

Gracias a ZYX y Drasill, yo era capaz de modificar su función para obtener la funcionalidad deseada:

function ScrollToPercent(percent) 
    let movelines=winheight(0)*a:percent/100 

    if has("float") && type(movelines)==type(0.0) 
     let movelines=float2nr(movelines) 
    endif 

    let oldso=&so 
    execute ":set so=" . movelines 
    execute "normal! zt" 
    execute ":set so=" . oldso 
endfunction 

Respuesta

4

            
 
  
              
function ScrollToPercent(percent) 
    let curlnr=line('.') 
    let targetlnr=line('w0')+(winheight(0)*a:percent/100) 
    let movelines=targetlnr-curlnr 
    if movelines<0 
     let motion='k' 
     let movelines=-movelines 
    elseif movelines>0 
     let motion='j' 
    else 
     return 0 
    endif 
    if has("float") && type(movelines)==type(0.0) 
     let movelines=float2nr(movelines) 
    endif 
    execute "normal! ".movelines.motion 
endfunction 

            
 
Lo sentimos, esta función cambia la corriente línea, mientras que necesita cambiar la posición de la ventana de la línea actual. Aquí es la correcta:

 
function! ScrollToPercent(percent) 
    let movelines=winheight(0)*(50-a:percent)/100 
    echo movelines 
    if movelines<0 
     let motion='k' 
     let rmotion='j' 
     let movelines=-movelines 
    elseif movelines>0 
     let motion='j' 
     let rmotion='k' 
    else 
     return 0 
    endif 
    if has('float') && type(movelines)==type(0.0) 
     let movelines=float2nr(movelines) 
    endif 
    execute 'normal! zz'.movelines.motion.'zz'.movelines.rmotion 
endfunction 

ponga esta función en su .vimrc y definir una asignación, tales como:

nnoremap z%2 :<C-u>call ScrollToPercent(20)<CR> 
+0

Gracias por el ejemplo, pero esta función solo mueve el cursor, no el cursor y la línea debajo del cursor. Ver mi edición anterior para mi resultado final. –

+0

@Nick Canzoneri Solo estaba actualizando mi función mientras escribía este comentario. – ZyX

0

lo llevo a conocer zb y zt que se desplaza la línea actual a la abajo o arriba, respectivamente?

+0

Sí, lo sabía. Estaba buscando hacer algo entre zz y zt. –

13

Esto no es específicamente una respuesta a su pregunta, pero puede que le guste la opción scrolloff. Por ejemplo: :set scrolloff=5 siempre dejará 5 líneas visibles al principio y al final de su ventana.

Por lo tanto, cuando usa zt o zb, el cursor irá 5 líneas debajo de la parte superior (o 5 líneas arriba, respectivamente), que puede ser casi el 20% deseado.

Personalmente me encanta esta configuración.

:help scrolloff 
+1

¡He estado buscando esto por mucho tiempo! Muchas gracias. – ereOn

0

Poco relacionado, tengo^J asignada para mover el cursor hacia abajo una línea & luego centrar la pantalla:

map <C-J> jzz 
map <C-K> kzz 

Usted podría subsitute en su mapeo de desplazamiento a ciento en su sitio de zz.

De todos modos, esto tiene el efecto de dejar el cursor en el medio de la pantalla mientras el texto se desplaza por detrás. A menudo uso esto en lugar de j/k normal.

+0

¿por qué no simplemente actualizar el j y el k con su truco ?: mapa j jzz mapa k kzz – rodfersou

+0

@rodfersou - No siempre quiero centrar mi cursor. Es solo una manera conveniente de volver a centrar la pantalla cuando lo desee. –

Cuestiones relacionadas