web-dev-qa-db-fra.com

Quelle est la meilleure façon de faire un défilement fluide dans Vim?

Les principales commandes de défilement dans Vim sont:

  1. Ctrl-B et Ctrl-F, aussi bien que PageUp et PageDown faire défiler la page entière
  2. Ctrl-U et Ctrl-D faire défiler une demi-page par défaut
  3. Ctrl-Y et Ctrl-E faire défiler une ligne

Je perds le contexte visuel à chaque fois pour les deux premiers, j'ai donc développé la mauvaise habitude de frapper les seconds (Ctrl-Y et Ctrl-E) de façon répétitive.

Puisqu'il n'y a actuellement aucun support de première partie pour un défilement fluide, quelles sont les solutions/plugins les moins répréhensibles?

J'utilise à la fois Vim et GVim selon la tâche, et je suis heureux de les personnaliser séparément s'il n'y a pas vraiment de bon hack qui fonctionne pour les deux. La molette de défilement de la souris fonctionne bien dans GVim, mais je recherche des solutions basées sur le clavier.

69
Andrew Wagner

Mise à jour : j'ai maintenant poussé ce code, refactorisé quelque peu selon les directives de :help write-plugin, à un Repo Github .

Utilisation du clavier

Voici ce que j'ai dans mon .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

Fonctionnalités:

  • Faites défiler sur la base de l'option Vim scroll.
  • Vitesse de défilement personnalisable (ajustez l'argument time de la commande sleep; j'utilise dix millisecondes). Remarque : tout comme le ralentissement de la fréquence d'images sur une vidéo, si vous ralentissez trop le défilement lisse, ce sera un défilement saccadé, pas un défilement lisse. Mais ce qui vous convient le mieux.
  • Fonctionne en mode normal ou d'insertion.

Remarque : tous vous copiez-collez, rappelez-vous que le ^ le caractère indique un caractère de contrôle; le copier-coller produira des résultats invalides et ceux-ci doivent être saisis manuellement!

  • ^YCTRL-V puis CTRL-Y
  • ^ECTRL-V puis CTRL-E

Cependant, le <C-U> et <Enter> les syntaxes de style sont littéralement typées comme ces caractères; la commande map les convertit intelligemment en caractères de contrôle.

Utilisation de la souris

La question mentionne que le défilement avec la souris fonctionne bien dans GVim, mais une solution de clavier est souhaitée. Cela implique pour moi que le demandeur peut être intéressé par une solution de souris si elle fonctionne dans le terminal régulier Vim.

Pour moi, l'activation de la prise en charge de la souris permet un défilement fluide de la molette de la souris. De plus, pour moi, le défilement fluide est le plus important lorsque je regarde autour de moi (c.-à-d. En mode normal), pas lorsque je modifie (en mode insertion), et si je ne modifie pas activement, la nécessité pour mes mains de rester sur le le clavier est supprimé à tout moment, donc cela fonctionne bien.

Sur la base de cette question , cependant, il semblerait que certaines personnes doivent faire une configuration plus manuelle au-delà de simplement allumer la souris (j'utilise simplement set mouse=n):


Ma .vimrc a les lignes suivantes

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

33
Keith Pinson

Il y a un simple piratage de remappage dans les conseils de vim.txt:

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>
9
Andrew Wagner

Un plugin récent

J'ai posté quelque chose de similaire ici , mais fondamentalement, il existe un excellent plugin que nous pouvons utiliser maintenant pour le défilement, appelé terryma/vim-smooth-scroll . Il offre un défilement très agréable et fluide.


L'installation est assez simple:

1 J'utilise Vundle donc j'ai simplement ajouté ceci dans . Vimrc.bundles :

Bundle terryma/vim-smooth-scroll

Dans la dernière version de Vundle disponible aujourd'hui, le 29 avril 2016, vous pouvez le mettre dans votre . Vimrc :

Plugin 'terryma/vim-smooth-scroll'

2 Comme indiqué dans la doc, vous pouvez configurer 3 arguments: distance , durée et vitesse .

J'utilise ceci dans mon fichier . 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>
6
Mick

Plug sans vergogne, mais j'ai créé un plugin ici que vous pouvez utiliser pour ajuster facilement la distance, la vitesse et la durée de l'animation de défilement: https://github.com/terryma/vim-smooth-scroll

4
terryma

Ce n'est pas exactement un défilement fluide, mais c'est la façon dont je gère la perte de contexte lors du saut de pages.

définir so = 7

'scrolloff' 'so' number (default 0) global
{pas dans Vi}
Nombre minimal de lignes d'écran à conserver au-dessus et en dessous du curseur. Cela rendra un certain contexte visible autour de l'endroit où vous travaillez. Si vous le définissez sur une très grande valeur (999), la ligne du curseur sera toujours au milieu de la fenêtre (sauf au début ou à la fin du fichier ou lorsque de longues lignes s'habillent). Pour un défilement horizontal, voir 'sidecrolloff'. REMARQUE: cette option est définie sur 0 lorsque "compatible" est défini.

3
DevinDawson

Ce que je fais, c'est que je règle la répétition du clavier sur très rapide, environ 120 caractères/seconde, et le délai est petit. Ensuite, je mappe en 4j et en 4k, je navigue de haut en bas en utilisant le code source en utilisant j et k, ce qui déplace le curseur de haut en bas Nice et rapide, assez fluide. Mais voici la bonne partie, et cela fonctionne sur Linux, pas Windows. Depuis un certain nombre d'années maintenant, la saisie au clavier du X11 fonctionne de telle manière que lorsque vous appuyez et maintenez j, il commence évidemment à émettre j caractères. Mais lorsque vous maintenez ensuite la touche j enfoncée et que vous appuyez également sur la touche ctrl, X11 commence à émettre des caractères c-j sans avoir à appuyer à nouveau sur la touche j. Ensuite, lorsque vous relâchez la touche ctrl et continuez d'appuyer sur j, X11 continue de mettre à nouveau les j. Donc j fait que le curseur commence à se déplacer Nice et lisse vers le bas, et vous pouvez périodiquement appuyer sur ctrl sans lâcher j pour lui donner un coup de pouce, une secousse.

De plus, je fais ce que fait Devin et je mets scrolloffset à 5.

Enfin, j'échange ctrl et cap lock. La position par défaut de la touche ctrl est complètement retardée (aucune infraction prévue). Cela vous oblige à faire pivoter votre main gauche. Je n'utilise presque jamais de verrouillage des majuscules, alors je les échange. Ensuite, mon doigt rose gauche peut atteindre la touche ctrl sans aucun mouvement de yoga.

Ces choses fonctionnent pour moi depuis des années. J'utilise uniquement vim, jamais gvim.

3
Mike

Le plugin cskeeters/vim-smooth-scroll prend en charge le défilement fluide et ne nécessite aucune configuration. Il prend en charge la prise en charge du défilement fluide avec zt, zz et zb. C'est un fork de plugin de terryma . Certaines des demandes d'extraction ouvertes ont été appliquées.

2
Chad Skeeters

Je viens de trouver ce plugin appelé "accelerated-smooth-scroll" ("plugin Vim pour un défilement fluide accéléré (mappage vers <C-D>/<C-U>, <C-F>/<C-B>) ") qui peut par exemple être utilisé via Vundle en mettant cette ligne dans votre .vimrc:

Plugin 'yonchu/accelerated-smooth-scroll'

Ensuite, en redémarrant Vim et en exécutant le :PluginInstall, puis redémarrez à nouveau Vim et utilisez la commande <C-D> (Ctrl+D) et <C-O> (Ctrl+O) commande normalement.

Malheureusement, ce plugin déplace également le curseur au lieu de ce que je voulais: faire simplement défiler l'écran comme le <C-E> et <C-Y> commandes.

0
silviubogan