2010-08-17 22 views
34

İmleç ekran ortasındayken aşağı doğru kaydırıldığında, imleç ekranda yukarı doğru hareket eder. Bunu yapmak istemiyorum.Ekrandaki imleçler değiştirilmeden Vim kaydırma ekranı

Ekrandaki imleçleri değiştirmeden nasıl kaydırırım?

Çözüm, cevap sonra eklenen:

noremap <C-k> 14j14<C-e> 
noremap <C-l> 14k14<C-y> 
+0

İmleçle ilerleyebilir veya imleci mevcut satırdan hareket ettirmeden ekranı kaydırabilirsiniz (çizgiler hareket halindeyken ekranda hareket edecek olsa da). Tam olarak aradığınız şeyi başarabileceğinizi sanmıyorum ... sadece sayfalara isabet etmeyi nasıl düşünüyorsunuz? .. – Fosco

+0

sayfa aşağı doğru sadece büyük hareket kaydırma. –

+3

Bu bir tekrarıdır: http://stackoverflow.com/questions/3458689/how-to-move-screen-without-moving-cursor-in-vim/ – GWW

cevap

5

hem imleç ve her yerde ekranda imleç görünüm taşımak isterseniz, belki de her ikisini birden yapın bazı özel tuş bağları kurmak gerekir .

Mesela:

:nnoremap <C-M-u> j<C-e> 

Bu (j) imleci iniyoruz ve Ctrl-Alt-u (sadece normal modda) e basarsanız viewport (Ctrl-e) hareket edecektir. - E ve ctrl - Y kaydırma penceresine imlecin konumunu hareket ettirmeden tampon ctrl:

41

Aklıma iki yolu vardır. Bence istediğin bu. E ve ctrl - - hareketi tuşlarıyla Y Eğer çok sayıda scrolloff ayarlarsanız Ayrıca, sen ctrl aynı etkiyi alırsınız. scrolloff ayarı, imlecin pencereye göre dikey olarak hareket etmesini zorlaştırır. (Bir şey :set so=999 gibi soscrolloff kısaltmasıdır kullanın.)

:help 'scrolloff' 
:help scrolling 
+2

'ctrl-E' **, imlecin pencereye göre konumunu hareket ettirir, imleç metni izler; İmleç pencerenin/ekranın ortasındaysa ve ctrl-E tuşuna art arda basarsanız, imleç ilk satıra hareket eder; Bu tam olarak asker istemez; o 14j14 'yapmak istiyor sadece ekranın boyutu –

+1

büyüklüğüne bağlı olarak bir sayı ile sadece 14 ile değiştirirsiniz ikinci öneri, kaydırma kaydırma, op sorar ne yapar, ama ** ** aynı etkiyi vermek değil 'ctrl-e'; sadece kaydırma ile ilgili sorun, artık kaydırma yapmadan hareket etmenin mümkün olmadığı anlamda kalıcı olmasıdır; Bir tuşun hareket etmesi ve –

+0

"so" seçeneğinin artması kaydıyla hareket etmemesi iyi olur, ancak @ Matthias009 doğrudur. –

10

ctrl - D ve ctrl - U istediğiniz şeydir.

ctrl - D14j14<C-e> aynı etkiye sahiptir (sayı 14 sabit kodlanmış değildir sadece ve hareket miktarı ekranın gerçek büyüklüğüne bağlıdır): Sen aşağı imleç birkaç satır taşımak metin ancak imleç ekranın ortasında kalır.

Benzer ctrl - U 14k14<C-y> gibi çalışır.

Ek: Ekranınız 30 satıra sahipse, o zaman ikisi de aynıdır.

+1

Daha doğrusu: [sayısı] ve [sayısı] istediği şeydir. – ciastek

+0

@ciastek Cevap vermelisiniz. – Zenexer

0

Bu eşleştirmeyi deneyin.vimrc

map <ScrollWheelUp> 5<C-Y> 
map <ScrollWheelDown> 5<C-E> 
0

Bu imleç ekranda pozisyonunu değiştirir, ancak ekrandaki pozisyonu imleç çizgisini değiştirmez: Ancak bu scroll seçeneği sıfırlar

noremap <C-k> @="1\<lt>C-D>"<CR>:set scroll=0<CR> 
noremap <C-l> @="1\<lt>C-U>"<CR>:set scroll=0<CR> 

, bu nedenle sonraki <C-D> ve <C-U> kayacaktır yarı ekran set scroll=0 olmadan, scroll seçeneği 1 olarak ayarlanmış ve sonraki <C-D> ve <C-U> bir satırda kaydırılabilir (Vim gariptir).

Muhtemelen 1<C-D> ve 1<C-U> tabanlı bir Vimscript işlevi en iyisi olacaktır.

0

Bildiğim iki yöntem var. senin .vimrc dosyasına şu satırları ekleyin (sadece bir iki yöntemden seçerek):

Yöntem 1: Bu ekran üstünde, bot ve GK gitmek için normal bir H, L kullanır

function! s:GetNumScroll(num) 
    let num_rows = winheight(0) 
    let num_scroll = a:num 
    if (a:num == -1) 
    let num_scroll = (num_rows + 1)/2 
    elseif (a:num == -2) 
    let num_scroll = num_rows 
    endif 
    if (num_scroll < 1) 
    let num_scroll = 1 
    endif 
    return num_scroll 
endfunction 

function! s:RtrnToOrig(before_scr_line) 
    normal H 
    let delta = a:before_scr_line - winline() 
    while (delta != 0) 
    if (delta < 0) 
     let delta = winline() - a:before_scr_line 
     let iter = 1 
     while (iter <= delta) 
     execute "normal" "gk" 
     let iter +=1 
     endwhile 
    elseif (delta > 0) 
     let iter = 1 
     while (iter <= delta) 
     execute "normal" "gj" 
     let iter +=1 
     endwhile 
    endif 
    let delta = a:before_scr_line - winline() 
    endwhile 
endfunction 

function! s:scrollUP(num) 
    let num_scroll = <SID>GetNumScroll(a:num) 
    let num_rows = winheight(0) 
    " ------------- 
    let before_scr_line = winline() 
    normal L 
    let after_scr_line = winline() 
    let extra = num_rows - after_scr_line 
    let extra += num_scroll 
    " move by 1 to prevent over scrolling 
    let iter = 1 
    while (iter <= extra) 
    execute "normal" "gj" 
    let iter +=1 
    endwhile 
    " ------------- 
    call <SID>RtrnToOrig(before_scr_line) 
endfunction 

function! s:scrollDN(num) 
    let num_scroll = <SID>GetNumScroll(a:num) 
    " ------------- 
    let before_scr_line = winline() 
    normal H 
    let after_scr_line = line(".") 
    execute "normal" "gk" 
    let after_scr2_line = line(".") 
    if ((after_scr_line == after_scr2_line) && (after_scr_line > 1)) 
    execute "normal" "gk" 
    endif 
    let extra = (num_scroll - 1) 
    let extra += (winline() - 1) 
    " move by 1 to prevent over scrolling 
    let iter = 1 
    while (iter <= extra) 
    execute "normal" "gk" 
    let iter +=1 
    endwhile 
    " ------------- 
    call <SID>RtrnToOrig(before_scr_line) 
endfunction 

nmap <silent> <C-J>  :call <SID>scrollUP(1)<CR> 
nmap <silent> <C-K>  :call <SID>scrollDN(1)<CR> 
nmap <silent> <C-F>  :call <SID>scrollUP(-1)<CR> 
nmap <silent> <C-B>  :call <SID>scrollDN(-1)<CR> 
nmap <silent> <PageDown>:call <SID>scrollUP(-2)<CR> 
nmap <silent> <PageUp> :call <SID>scrollDN(-2)<CR> 

, gj komutları, gerçek satır yerine ekran çizgisiyle aşağı yukarı hareket eder. Çizgiler ekran genişliğinden daha uzun olduğunda ve wordwrap özelliği açıkken, yalnızca daha doğru çalışması gerekiyordu.

Veya (daha önce Stack Borsası vim ipuçları wiki ve üzerinde gönderilmemiş) bu yöntem:

" N<C-D> and N<C-U> idiotically change the scroll setting 
function! s:Saving_scrollV(cmd) 
    let save_scroll = &scroll 
    execute "normal" a:cmd 
    let &scroll = save_scroll 
endfunction 

" move and scroll 
nmap <silent> <C-J>   :call <SID>Saving_scrollV("1<C-V><C-D>")<CR> 
vmap <silent> <C-J> <Esc>  :call <SID>Saving_scrollV("gv1<C-V><C-D>")<CR> 
nmap <silent> <C-K>   :call <SID>Saving_scrollV("1<C-V><C-U>")<CR> 
vmap <silent> <C-K> <Esc>  :call <SID>Saving_scrollV("gv1<C-V><C-U>")<CR> 

nmap <silent> <C-F>   :call <SID>Saving_scrollV("<C-V><C-D>")<CR> 
vmap <silent> <C-F> <Esc>  :call <SID>Saving_scrollV("gv<C-V><C-D>")<CR> 
nmap <silent> <PageDown>  :call <SID>Saving_scrollV("<C-V><C-D>")<CR> 
vmap <silent> <PageDown> <Esc>:call <SID>Saving_scrollV("gv<C-V><C-D>")<CR> 

nmap <silent> <C-B>   :call <SID>Saving_scrollV("<C-V><C-U>")<CR> 
vmap <silent> <C-B> <Esc>  :call <SID>Saving_scrollV("gv<C-V><C-U>")<CR> 
nmap <silent> <PageUp>  :call <SID>Saving_scrollV("<C-V><C-U>")<CR> 
vmap <silent> <PageUp> <Esc> :call <SID>Saving_scrollV("gv<C-V><C-U>")<CR> 

Ben ikinci yöntemi ile sahip tek sorun hatları olduğunda geçerli: 2

Yöntem ekran genişliğinden daha uzun ve wordwrap açık olduğunda, imleç sargıdan ekstra satırları hesaba katmak için yukarı veya aşağı hareket edebilir. Ayrıca dosyanın en üstünde ve sonunda imleç hareket edebilir. İlk yöntem, imleci her durumda asla hareket ettirme girişiminde bulunmaz.

+0

Lütfen cevaplarınız hakkında daha detaylı açıklamalar verebilir misiniz? Aksi halde daha sonra gelen herkes için anlamsızdır. –

+0

Peki, bu satırları .vimrc dosyanıza eklersiniz.Wordwrap kapalıyken imleci hareket ettirmeden kaydırma yapmak oldukça kolaydır, ya da açıkken çizgiler sadece pencere genişliğinden daha kısadır. Ancak wordwrap açıkken ve çizgiler pencere genişliğinden daha uzun olduğunda, imleci yukarı veya aşağı doğru hareket ettirerek bir satır aşağı veya yukarı hareket ettirebilir. Üst yöntem ne olursa olsun imleç pozisyonunu korur, ama sadece normal modda kullanırım. –

+0

normal H, üst çizgiye gider ve normal L, alt çizgiye gider ve buradan, bir ekran çizgisini kaydırmak için "gj" veya "gk" ile kaç tane ekran çizgisinin hareket edeceğini ve sonra orijinal ekrana geri dönmeyi öğrenebilirsiniz. hat. –

İlgili konular