相对于光标,自定义映射滚动Vim

时间:2010-06-23 14:19:10

标签: vim

所以我看过:help scroll-cursor并且非常喜欢zz,它将光标所在的行放在窗口中间。

我正在寻找帮助来制作一个与zz类似的映射,但是将光标所在的行放在窗口高度的20%处(或25%,30%等)。


编辑:

感谢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 个答案:

答案 0 :(得分:13)

这不是您问题的具体答案,但您可能会选择scrolloff选项。

例如::set scrolloff=5将始终在窗口的开头和结尾留下5条可见行。

因此,当您使用ztzb时,光标将在顶部下方5行(或分别在底部5行),这几乎可以达到您想要的20%。

我个人喜欢这种设置。

:help scrolloff

答案 1 :(得分: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>

答案 2 :(得分:1)

有些相关,我已经^ J映射将光标向下移动一行&amp;然后重新进入屏幕:

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

你可以用滚动到百分比的映射代替zz。

无论如何,这会将光标留在屏幕中间而文本在其后面滚动 - 我经常使用它而不是普通的j / k。

答案 3 :(得分:0)

我知道zbzt分别将当前行滚动到底部或顶部?