2010-06-23 6 views
5

J'ai donc lu :help scroll-cursor et j'aime vraiment zz, ce qui place la ligne sur laquelle votre curseur se trouve au milieu de votre fenêtre.Défilement Vim par rapport au curseur, mappage personnalisé

Je cherche de l'aide pour faire un mapping qui fonctionnerait de manière similaire à zz mais met la ligne de mon curseur à 20% de la hauteur de la fenêtre (ou 25%, 30% etc).


Edit:

Merci à zyx et Drasill, j'ai pu modifier sa fonction pour obtenir la fonctionnalité souhaitée:

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 

Répondre

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 

            
 
Désolé, cette fonction change courant ligne, alors que vous devez changer la position de la fenêtre de la ligne en cours. Voici la bonne:

 
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 

Mettez cette fonction dans votre .vimrc et définir une cartographie, tels que:

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

Merci pour l'exemple, mais cette fonction déplace uniquement le curseur, pas le curseur et la ligne sous le curseur. Voir ma modification ci-dessus pour mon résultat final. –

+0

@Nick Canzoneri Juste mettait à jour ma fonction pendant que vous écriviez ce commentaire. – ZyX

0

Je suppose que vous connaissez zb et zt qui fait défiler la ligne courante au en bas ou en haut, respectivement?

+0

Oui, je savais à leur sujet. Je cherchais à faire quelque chose entre zz et zt. –

13

Ce n'est pas spécifiquement une réponse à votre question, mais vous pourriez aimer l'option scrolloff. Par exemple: :set scrolloff=5 laissera toujours 5 lignes visibles au début et à la fin de votre fenêtre. Donc, quand vous utilisez zt ou zb, votre curseur ira 5 lignes en haut (ou 5 lignes au-dessus du bas, respectivement), ce qui peut être presque votre 20% désiré.

Personnellement, j'adore ce réglage.

:help scrolloff 
+1

Je le cherchais depuis longtemps! Merci beaucoup. – ereOn

0

Un peu lié, j'ai^J cartographié pour déplacer le curseur vers le bas une ligne & recentrera alors l'écran:

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

Vous pouvez subsitute dans votre défilement à la cartographie pour cent en place de zz.

Quoi qu'il en soit, cela a pour effet de laisser le curseur au milieu de l'écran tandis que le texte défile derrière - je l'utilise souvent au lieu de j/k normal.

+0

pourquoi ne pas simplement mettre à jour le j et k avec votre astuce: carte j jzz carte k kzz – rodfersou

+0

@rodfersou - Je ne veux pas toujours mon curseur centré. C'est juste un moyen pratique de recentrer l'écran lorsque vous le souhaitez. –

Questions connexes