2010-06-23 16 views
5

So habe ich gelesen :help scroll-cursor und wirklich wie zz, die die Zeile setzt Ihren Cursor ist in der Mitte Ihres Fensters.Scrolling Vim relativ zum Cursor, benutzerdefinierte Zuordnung

Ich suche nach Hilfe, um ein Mapping zu machen, das ähnlich wie zz funktioniert, aber setzt die Zeile, die mein Cursor bei 20% der Fensterhöhe (oder 25%, 30% etc) ist.


Edit:

Dank ZYX und Drasill konnte ich seine Funktion ändern, um die gewünschte Funktionalität erhalten:

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 

Antwort

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 

            
 
Sorry, ändert diese Funktion den aktuellen Linie, während Sie die Fensterposition der aktuellen Linie ändern müssen. Hier ist die richtige:

 
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 

Setzen Sie diese Funktion in Ihrem .vimrc und definieren eine Zuordnung, wie zB:

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

Danke für das Beispiel, aber diese Funktion bewegt nur den Cursor, nicht den Cursor und die Zeile unter dem Cursor. Siehe meine obige Bearbeitung für mein Endergebnis. –

+0

@Nick Canzoneri Ich habe gerade meine Funktion aktualisiert, während Sie diesen Kommentar geschrieben haben. – ZyX

0

Ich nehme wissen Sie über zb und zt, die die aktuelle Zeile die scrollt bzw. unten?

+0

Ja, ich wusste von ihnen. Ich wollte etwas zwischen zz und zt machen. –

13

Dies ist nicht speziell eine Antwort auf Ihre Frage, aber Sie könnten die scrolloff Option mögen.

Zum Beispiel: :set scrolloff=5 werden immer 5 sichtbare Zeilen am Anfang und am Ende Ihres Fensters hinterlassen.

Also, wenn Sie zt oder zb verwenden, wird der Cursor 5 Zeilen unter (bzw. 5 Zeilen über Boden), die fast Ihre gewünschten 20% sein kann.

Ich persönlich liebe diese Einstellung.

:help scrolloff 
+1

Ich habe das schon lange gesucht! Danke vielmals. – ereOn

0

Etwas verwandt, ich habe^J kartiert den Cursor eine Zeile nach unten zu bewegen & dann den Bildschirm rieren:

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

Sie in Ihrem Scroll-to-Prozent-Mapping anstelle subsitute könnte von zz.

Jedenfalls hat dies den Effekt, dass der Cursor in der Mitte des Bildschirms bleibt, während der Text dahinter rollt - ich benutze das oft anstelle von normalem j/k.

+0

warum nicht nur aktualisieren Sie die j und k mit Ihrem Trick: map j jzz karte k kzz – rodfersou

+0

@rodfersou - Ich möchte nicht immer meinen Cursor zentriert. Es ist nur eine bequeme Möglichkeit, den Bildschirm bei Bedarf neu zu zentrieren. –