¿Cuál es la mejor manera de hacer un desplazamiento suave en Vim?

78

Los principales comandos de desplazamiento en Vim son:

  1. Ctrl- By Ctrl- F, así como PageUpy PageDowndesplazarse por la página completa
  2. Ctrl- Uy Ctrl- Ddesplazarse media página de forma predeterminada
  3. Ctrl- Yy Ctrl- Edesplazarse una línea

Cada vez que pierdo el contexto visual para los dos primeros, he desarrollado el mal hábito de golpear el último ( Ctrl- Yy Ctrl- E) repetidamente.

Dado que actualmente no hay soporte de primera parte para un desplazamiento suave, ¿cuáles son las soluciones / complementos menos objetables?

Utilizo Vim y GVim dependiendo de la tarea, y estoy feliz de personalizarlos por separado si no hay un truco realmente bueno que funcione para ambos. La rueda de desplazamiento del mouse funciona bien en GVim, pero estoy buscando soluciones basadas en teclado.

Andrew Wagner
fuente
[Ctrl + U] no funcionó, [Ctrl + u] funciona, ¿qué versión de vi (m) usaste?
AjayKumarBasuthkar

Respuestas:

38

Actualización : ahora he enviado este código, refactorizado un poco de acuerdo con las pautas en :help write-plugin, a un repositorio de Github .

Usando el teclado

Esto es lo que tengo en mi .vimrc:

function SmoothScroll(up)
    if a:up
        let scrollaction="^Y"
    else
        let scrollaction="^E"
    endif
    exec "normal " . scrollaction
    redraw
    let counter=1
    while counter<&scroll
        let counter+=1
        sleep 10m
        redraw
        exec "normal " . scrollaction
    endwhile
endfunction

nnoremap <C-U> :call SmoothScroll(1)<Enter>
nnoremap <C-D> :call SmoothScroll(0)<Enter>
inoremap <C-U> <Esc>:call SmoothScroll(1)<Enter>i
inoremap <C-D> <Esc>:call SmoothScroll(0)<Enter>i

caracteristicas:

  • Desplácese en la base de la scrollopción Vim .
  • Velocidad de desplazamiento personalizable (ajuste el argumento de tiempo del sleepcomando; yo uso diez milisegundos). Nota : al igual que reducir la velocidad de fotogramas en un video, si ralentiza demasiado el desplazamiento suave, será un desplazamiento desigual, no un desplazamiento suave. Pero lo que funcione mejor para ti.
  • Funciona en modo normal o de inserción.

Nota : todos los que copien y peguen, recuerden que el ^carácter indica un carácter de control; copiar y pegar producirá resultados no válidos y estos se deben ingresar manualmente.

  • ^Y- CTRL- Ventonces CTRL-Y
  • ^E- CTRL- Ventonces CTRL-E

Sin embargo, las sintaxis de estilo <C-U>y <Enter>se escriben literalmente como esos caracteres; el comando map los convierte inteligentemente en personajes de control.

Usando el mouse

La pregunta menciona que el desplazamiento con el mouse funciona bien en GVim, pero se desea una solución de teclado. Esto me implica que el autor de la pregunta puede estar interesado en una solución de mouse si funciona en el terminal Vim normal.

Para mí, activar el soporte del mouse permite un desplazamiento suave a través de la rueda del mouse. Además, para mí, el desplazamiento suave es más importante cuando miro a mi alrededor (es decir, en modo normal), no cuando estoy editando (en modo de inserción), y si no estoy editando activamente, la necesidad de que mis manos permanezcan en el El teclado en todo momento se elimina, por lo que esto funciona bien.

Sin embargo, sobre la base de esta pregunta , parecería que algunas personas tienen que hacer una configuración más manual más allá de simplemente encender el mouse (solo uso set mouse=n):


Mi .vimrctiene las siguientes líneas

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>

Keith Pinson
fuente
Esto funciona muy bien ... y no depende de la velocidad de la máquina como la otra respuesta. ¡Salud!
Steve Vermeulen
1
Advertencia: He descubierto que no debe presionar <kbd> Ctrl </kbd> - <kbd> D </kbd>, etc. hasta que el desplazamiento anterior haya terminado o el comportamiento sea extraño. No me he encontrado con este problema antes, por lo que no sé si no lo noté o si es específico de la configuración de Vim en la máquina actual que estoy usando. Si alguien sabe cómo lidiar con el subproceso múltiple en Vim (!!), no dude
Keith Pinson
Una posible mejora aquí que se me ocurrió sería aplicar el mismo desplazamiento suave a los comandos zz, z-, z <cr>
Steve Vermeulen
Es una buena idea. Podrías reasignarlos de la misma manera, supongo.
Keith Pinson
3
Un pequeño comentario sobre 'recuerde que el carácter ^ indica un carácter de control': puede reemplazar 'let scrollaction = "^ Y"' con 'let scrollaction = "\ <Cy>"' de modo que no tenga que usar <Cv> <Cy> para producir la combinación de teclas Y hace posible copiar y pegar :)
gospes
11

Hay un truco de reasignación simple en tips.txt de vim:

Smooth scrolling                    *scroll-smooth*

If you like the scrolling to go a bit smoother, you can use these mappings:

    :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
    :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>
Andrew Wagner
fuente
1
¿Por qué sería preferible usar la configuración de la opción 'scroll' (por ejemplo,: set scroll = 15)? La opción de desplazamiento parece preferible porque incluso podría crear un comando au que lo cambie automáticamente cuando cambie la altura de la ventana. (Supongo que también podría hacer algo así con este método de mapeo, pero la opción de desplazamiento simplifica las cosas).
Herbert Sitz
1
En realidad, la configuración automática de la variable de desplazamiento es una de las opciones que también estaba considerando. Como mencionas, debe ser apropiado para el tamaño de la ventana. La variable de desplazamiento por defecto es la mitad de la altura de la ventana, pero no parece exponer una forma de cambiar esa fracción; solo puede cambiarlo en términos del número de líneas. También es posible que deba establecer un valor más pequeño para el desplazamiento que si también tuviera algún tipo de desplazamiento suave, ya que sus ojos no tendrán ningún estado de desplazamiento intermedio para mejorar la persistencia de la visión.
Andrew Wagner
1
Para aclarar, cd y cu se desplazarán por lo que esté configurada la opción 'scroll'. El valor predeterminado es 1/2 de la altura de la ventana, pero puede configurarlo como desee. Si desea que un nuevo valor dependa de la altura de la ventana, utilice la función 'winheight ("%")', que devuelve el número de líneas en la ventana. Entonces, por ejemplo, el comando ': set scroll = winheight ("%") / 3' haría que cu y cd se desplazaran 1/3 de la altura de la ventana.
Herbert Sitz
1
@Drew Wagner Este mapeo debe reescribirse noremap <expr> <C-u> repeat("\<C-y>", 20)para facilitar la lectura.
ZyX
9
O simplemente:map <C-U> 20<C-Y>
anishsane
7

Un complemento reciente

He publicado algo similar aquí , pero básicamente hay un gran complemento que podemos usar ahora para el desplazamiento, llamado terryma / vim-smooth-scroll . Proporciona un desplazamiento muy agradable y suave.


La instalación es bastante sencilla:

1Yo uso Vundle, así que simplemente agregué esto en .vimrc.bundles :

Bundle terryma/vim-smooth-scroll

En la última versión de Vundle disponible hoy, 29 de abril de 2016, puede poner esto en su .vimrc :

Plugin 'terryma/vim-smooth-scroll'

2Como se indica en el documento, puede configurar 3 argumentos: distancia , duración y velocidad .

Estoy usando esto en mi archivo .vimrc :

noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>
Mick
fuente
1
Lamentablemente, este complemento también mueve el cursor en lugar de lo que quería: simplemente desplazar la pantalla como los comandos <C-E>y <C-Y>.
silviubogan
4

Lo que hago es configurar la repetición del teclado en muy rápido, alrededor de 120 caracteres / segundo, y el retraso pequeño. Luego mapeo a 4j y a 4k navego hacia arriba y hacia abajo por el código fuente usando j y k, lo que mueve el cursor hacia arriba y hacia abajo de manera agradable y rápida, bastante suave. Pero aquí está la parte buena, y esto funciona en Linux, no en Windows. Desde hace varios años, la entrada del teclado de X11 funciona de tal manera que cuando presiona y mantiene presionada j, obviamente comienza a poner j caracteres. Pero cuando mantiene presionada la tecla j y luego también presiona la tecla ctrl, X11 comienza a colocar los caracteres cj sin que tenga que volver a presionar la tecla j. Luego, cuando suelta la tecla ctrl y sigue presionando j, X11 continúa poniendo j de nuevo. Entonces j hace que el cursor comience a moverse suavemente hacia abajo, y puedes presionar ctrl periódicamente sin soltar j para darle un impulso,

Además, hago lo que hace Devin y configuro scrolloffset en 5.

Por último, cambio ctrl y bloqueo de mayúsculas. La posición predeterminada de la tecla ctrl está completamente retardada (sin intención de ofender). Hace que tengas que rotar tu mano izquierda. Casi nunca uso el bloqueo de mayúsculas, así que las cambio. Entonces mi dedo meñique izquierdo puede alcanzar la tecla Ctrl sin ningún movimiento de yoga.

Estas cosas me han funcionado durante años. Solo uso vim, nunca gvim.

Miguel
fuente
3
+1 por lamentar la ubicación de la tecla de control. En mi opinión, la tecla de comando de macbook no es mucho mejor.
Tríptico
3

Esto no es exactamente un desplazamiento suave, pero es la forma en que manejo no perder contexto al saltar páginas.

establecer así = 7

'scrolloff' 'so' número (predeterminado 0) global
{no en Vi}
Número mínimo de líneas de pantalla para mantener por encima y por debajo del cursor. Esto hará que algo de contexto sea visible alrededor del lugar donde está trabajando. Si lo establece en un valor muy grande (999), la línea del cursor siempre estará en el medio de la ventana (excepto al principio o al final del archivo o cuando las líneas largas se ajustan). Para desplazarse horizontalmente, consulte 'desplazamiento lateral'. NOTA: Esta opción se establece en 0 cuando se establece 'compatible'.

DevinDawson
fuente
3

El complemento cskeeters / vim-smooth-scroll admite un desplazamiento suave y no requiere configuración. Es compatible para apoyar el desplazamiento suave con zt, zz, y zb. Es una bifurcación del complemento de terryma . Se han aplicado algunas de las solicitudes de extracción abiertas.

Chad Skeeters
fuente
1
N <CR-E>
N <CR-Y>

... donde 'N' es el número de líneas individuales que desea desplazar.

No es suave en sentido literal, pero te quedas con el teclado.

fde-capu
fuente
0

Acabo de encontrar este plugin llamado "acelerada-alisar-Scroll" ( "Vim plugin para el desplazamiento suave acelerada (mapeo para <C-D>/<C-U>, <C-F>/<C-B>)") que puede ser utilizado, por ejemplo, a través Vundle al poner esta línea en su .vimrc:

Plugin 'yonchu/accelerated-smooth-scroll'

Luego, reiniciando Vim y ejecutando el :PluginInstallcomando, luego reinicie Vim nuevamente y use las teclas <C-D>( Ctrl+D) y <C-O>(Ctrl+O comandos ) normalmente.

Lamentablemente, este complemento también mueve el cursor en lugar de lo que quería: simplemente desplazar la pantalla como los comandos <C-E>y <C-Y>.

Silviubogan
fuente
0

Esto combina muchas de estas respuestas, y esto es lo que uso.

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
Jason Eveleth
fuente