2010-06-23 28 views
5

Vì vậy, tôi đã đọc :help scroll-cursor và thực sự thích zz, đặt con trỏ chuột của bạn ở giữa cửa sổ.Cuộn Vim liên quan đến con trỏ, ánh xạ tùy chỉnh

Tôi đang tìm kiếm trợ giúp để thực hiện ánh xạ sẽ thực hiện tương tự như zz nhưng đặt con trỏ của tôi ở trên 20% chiều cao cửa sổ (hoặc 25%, 30% v.v.).


Edit:

Nhờ ZYX và Drasill, tôi đã có thể thay đổi chức năng của mình để có được những chức năng mong muốn:

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 

Trả lời

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 

            
 
Xin lỗi, chức năng này làm thay đổi hiện tại dòng, trong khi bạn cần thay đổi vị trí cửa sổ của dòng hiện tại. Dưới đây là quyền nhất:

 
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 

Đặt chức năng này trong .vimrc của bạn và xác định một ánh xạ, chẳng hạn như:

nnoremap z%2 :<C-u>call ScrollToPercent(20)<CR> 
+0

Cảm ơn ví dụ, nhưng chức năng này chỉ di chuyển con trỏ, không di chuyển con trỏ và dòng bên dưới con trỏ. Xem chỉnh sửa ở trên của tôi cho kết quả cuối cùng của tôi. –

+0

@Nick Canzoneri Vừa cập nhật chức năng của tôi trong khi bạn đang viết nhận xét này. – ZyX

0

Tôi mang nó bạn biết về zbzt mà cuộn dòng hiện tại với dưới cùng hoặc trên cùng, tương ứng?

+0

Đúng, tôi đã biết về chúng. Tôi đang tìm cách tạo ra thứ gì đó giữa zz và zt. –

13

Đây không phải là câu trả lời cụ thể cho câu hỏi của bạn, nhưng bạn có thể thích tùy chọn scrolloff.

Ví dụ: :set scrolloff=5 sẽ luôn để lại 5 dòng hiển thị khi bắt đầu và kết thúc cửa sổ của bạn.

Vì vậy, khi bạn sử dụng zt hoặc zb, con trỏ của bạn sẽ đi 5 dòng dưới đầu (hoặc 5 dòng ở trên cùng, tương ứng), gần như có thể là 20% mong muốn của bạn.

Cá nhân tôi thích cài đặt này.

:help scrolloff 
+1

Tôi đã tìm kiếm điều này trong một thời gian dài! Cảm ơn nhiều. – ereOn

0

Hơi liên quan, tôi đã có^J ánh xạ để chuyển con trỏ xuống một dòng & sau đó recenter màn hình:

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

Bạn có thể subsitute trong bản đồ cuộn-to-phần trăm cố định một chỗ của zz.

Dù sao, điều này có tác dụng rời khỏi con trỏ ở giữa màn hình trong khi văn bản cuộn phía sau nó - tôi thường sử dụng nó thay vì j/k bình thường.

+0

lý do tại sao không chỉ cập nhật j và k với mẹo của bạn: bản đồ j jzz bản đồ k kzz – rodfersou

+0

@rodfersou - Tôi không luôn muốn con trỏ của mình làm trung tâm. Nó chỉ là một cách thuận tiện để recenter màn hình khi mong muốn. –

Các vấn đề liên quan