Прокрутка Vim относительно курсора, пользовательское сопоставление

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

Я ищу помощь для создания сопоставления, которое будет похоже на 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

Ответ 1


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
удаp > К сожалению, эта функция меняет текущую строку, в то время как вам нужно изменить положение окна текущей строки. Вот правильный вариант:
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>

Ответ 2

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

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

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

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

:help scrolloff

Ответ 3

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

Ответ 4

Немного связанный, у меня есть J J, отображаемый для перемещения курсора по одной строке, а затем для повторного включения экрана:

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

Вместо zz вы можете записаться в сопоставление прокрутки к проценту.

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