2010-06-23 2 views
5

Итак, я прочитал :help scroll-cursor и действительно понравился zz, который помещает линию, в которой находится ваш курсор, посредине вашего окна.Прокрутка Vim относительно курсора, пользовательское сопоставление

Я ищу помощь для создания сопоставления, которое будет работать подобно zz, но помещает линию, на которую мой курсор находится на 20% высоты окна (или 25%, 30% и т. Д.).


Edit:

Благодаря ZYX и Drasill, я был в состоянии изменить свою функцию, чтобы получить нужную функциональность:

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 

ответ

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 

            
 
К сожалению, эта функция изменяет ток в то время как вам нужно изменить положение окна текущей строки. Вот правильная:

 
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 

Поместите эту функцию в .vimrc и определит отображение, такие как:

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

Спасибо за пример, но эта функция перемещает курсор, а не курсор и строку под курсором. См. Мой выше edit для моего конечного результата. –

+0

@Nick Canzoneri Просто обновлял мою функцию, когда вы писали этот комментарий. – ZyX

0

Я понимаю, что вы знаете о zb и zt, который прокручивает текущую строку в нижней или верхней, соответственно?

+0

Да, я знал о них. Я искал что-то между zz и zt. –

13

Это не конкретный ответ на ваш вопрос, но вам может понравиться опция scrolloff.

Например: :set scrolloff=5 всегда оставит 5 видимых линий в начале и в конце вашего окна.

Итак, когда вы используете zt или zb, ваш курсор будет идти по 5 линиям вверху (или 5 строк над дном соответственно), что может быть почти желательным 20%.

Мне лично это нравится.

:help scrolloff 
+1

Я искал это в течение длительного времени! Большое спасибо. – ereOn

0

Несколько родственных, у меня есть^J сопоставляется, чтобы переместить курсор вниз на одну строки & затем центрирование экрана:

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

Вы можете subsitute в вашем отображении прокрутки на-проценты в месте zz.

В любом случае, это приводит к тому, что курсор находится посредине экрана, а текст прокручивается за ним - я часто использую это вместо обычного j/k.

+0

Почему бы не просто обновить j и k с помощью трюка: map j jzz map k kzz – rodfersou

+0

@rodfersou - Я не всегда хочу, чтобы мой курсор был сцентрирован. Это просто удобный способ повторного включения экрана по желанию. –

Смежные вопросы