2010-06-23 34 views
5

所以我读:help scroll-cursor,真的很喜欢zz,它把你的光标在你的窗口中间。滚动Vim相对于光标,自定义映射

我正在寻找帮助来制作类似于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

            
 
  
              
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

感谢您的示例,但此功能只移动光标,而不是光标和光标下方的行。查看我的上述编辑以获得最终结果。 – 2010-06-23 17:54:30

+0

@Nick Canzoneri刚刚在写这篇评论时正在更新我的功能。 – ZyX 2010-06-23 17:55:29

0

我想你知道zbzt其滚动当前行到底部还是顶部?

+0

是的,我知道他们。我正在寻找zz和zt之间的东西。 – 2010-06-23 17:55:17

13

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

例如::set scrolloff=5将始终在窗口的开始和结束处留出5条可见行。

因此,当您使用ztzb时,您的光标将在顶部(或分别位于底部的5行)下移动5行,这几乎可以是您所需的20%。

我个人喜欢这个设置。

:help scrolloff 
+1

我一直在寻找这个很长一段时间!非常感谢。 – ereOn 2010-08-11 14:00:55

0

有点关系,我有道^ J映射到移动光标下移一行&然后recenter屏幕:

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

您可以在您的滚动到百分之映射替补多到位的zz。

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

+0

为什么不只是用你的技巧更新j和k: 地图j jzz 地图k kzz – rodfersou 2015-08-04 18:50:13

+0

@rodfersou - 我并不总是希望我的光标居中。这只是一个方便的方法,在需要时重新屏蔽屏幕。 – 2015-08-06 19:07:12