2010-06-23 64 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