2010-06-23 11 views
5

Quindi ho letto :help scroll-cursor e mi piace molto zz, che mette la linea su cui si trova il cursore al centro della finestra.Scorrimento Vim relativo al cursore, mappatura personalizzata

Sto cercando aiuto per creare una mappatura che abbia un rendimento simile a zz ma mette la linea su cui è posizionato il cursore al 20% dell'altezza della finestra (o 25%, 30% ecc.).


Modifica:

Grazie a ZYX e Drasill, sono stato in grado di modificare la sua funzione per ottenere la funzionalità desiderata:

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 

risposta

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 

            
 
Siamo spiacenti, questa funzione cambia la corrente linea, mentre è necessario modificare la posizione della finestra della linea corrente. Ecco quella giusta:

 
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 

mettete questa funzione nel vostro .vimrc e definire una mappatura, come ad esempio:

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

Grazie per l'esempio, ma questa funzione sposta solo il cursore, non il cursore e la linea sotto il cursore. Vedere la mia modifica sopra per il mio risultato finale. –

+0

@Nick Canzoneri Stavo semplicemente aggiornando la mia funzione mentre stavi scrivendo questo commento. – ZyX

0

lo prendo sai di zb e zt cui scorre la linea di corrente al inferiore o superiore, rispettivamente?

+0

Sì, sapevo di loro. Stavo cercando di fare qualcosa tra zz e zt. –

13

Questa non è una risposta specifica alla tua domanda, ma ti potrebbe piacere l'opzione scrolloff.

Ad esempio: :set scrolloff=5 lasceranno sempre 5 righe visibili all'inizio e alla fine della finestra.

Quindi, quando si utilizza zt o zb, il cursore si sposterà 5 linee in alto (o 5 righe sopra in basso, rispettivamente), che può essere quasi il 20% desiderato.

Personalmente amo questa impostazione.

:help scrolloff 
+1

Ho cercato questo per molto tempo! Grazie molto. – ereOn

0

in qualche modo correlato, ho^J mappato per spostare il cursore verso il basso di una riga & poi centrare nuovamente la schermata:

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

Potreste subsitute nella tua mappatura scroll-a-cento in luogo di zz.

In ogni caso, questo ha l'effetto di lasciare il cursore nel mezzo dello schermo mentre il testo scorre dietro di esso - Io uso spesso questo invece del normale j/k.

+0

perché non aggiornare semplicemente j & k con il tuo trucco: map j jzz map k kzz – rodfersou

+0

@rodfersou - Non sempre il mio cursore viene centrato. È solo un modo conveniente per ripristinare lo schermo quando lo si desidera. –

Problemi correlati