Прокрутка 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.