2010-08-17 2 views
34

커서가 화면 중간에 있고 아래로 스크롤하면 커서가 화면에서 위쪽으로 이동합니다. 나는 그렇게하기를 원하지 않는다.커서 위치 변경없이 화면 이동

화면상의 커서 위치를 변경하지 않고 스크롤하는 방법은 무엇입니까?

솔루션, 대답 후 추가 :

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

커서를 스크롤하거나 현재 행의 커서를 이동하지 않고 화면을 스크롤 할 수 있습니다 (선이 움직이기 때문에 화면에서 움직일 수는 있지만). 나는 당신이 찾고있는 것을 정확히 성취 할 수 있다고 생각하지 않는다 ... 단지 페이지를 때리면 어떨까요? ... – Fosco

+0

페이지가 아래로 움직이는 것은 단지 더 큰 움직임입니다. –

+3

이것은 다음을 반복합니다 : http://stackoverflow.com/questions/3458689/how-to-move-screen-without-moving-cursor-in-vim/ – GWW

답변

5

둘 다 커서 및 화면의 아무 곳에서 커서를 뷰포트를 이동하려면, 아마 당신은 한 번에 두 가지를 모두 수행하는 일부 사용자 지정 키 바인딩을 설정해야합니다 .

같은 :

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

이 (j를) 커서를 아래로 이동하고 Ctrl-Alt-u (만 일반 모드)를 누를 때마다 뷰포트 (Ctrl-e)를 이동합니다. - ECtrl 키 - Y 스크롤 창에 커서의 위치를 ​​이동하지 않고 버퍼 Ctrl 키를 :

41

은 내가 생각할 수있는 두 가지 방법이 있습니다. 나는 그것이 당신이 원하는 것이라고 생각합니다. ECtrl 키 - - 이동 키 Y 당신은 많은 수의 scrolloff를 설정하는 경우 또한, 당신은 Ctrl 키와 같은 효과를 얻을 것이다. scrolloff 설정은 창을 기준으로 커서가 수직으로 이동하는 것을 어렵게 만듭니다. (뭔가 :set so=999처럼 soscrolloff의 약어 인을 사용합니다.)

:help 'scrolloff' 
:help scrolling 
+2

'ctrl-E' ** **는 커서의 위치를 ​​창에 상대적으로 이동 시키며 커서는 텍스트를 따라갑니다. 커서가 윈도우/스크린의 중간에 있고'ctrl-E '를 반복해서 누르면 커서가 첫 번째 라인으로 이동합니다; 이것은 정확히 구두꾼이 원하지 않는 것입니다; 그는'14j14 '을 14 번으로 바꾸고 싶습니다. 화면의 크기에 따라 숫자가 달라집니다. –

+1

두번째 제안, scrolloff 설정, op가 요구하는대로 **는 ** 같은 효과를주지 않습니다. 'ctrl-E'; scrolloff와 관련된 문제는 스크롤하지 않고 이동할 수 없다는 의미에서 영구적이라는 것입니다. 하나의 키를 가지고 이동하고 스크롤하지 않고 이동하는 것이 좋을 것입니다. –

+0

'so' 옵션에 대한 Upvote가 있지만 @ Matthias009가 맞습니다. –

10

Ctrl 키를 - DCtrl 키 - U 당신이 원하는 것입니다.

Ctrl 키를 - D14j14<C-e> 것과 같은 효과가있다 (수 (14)가 하드 코딩되지 않은 단지를 움직임의 양이 화면의 실제 크기에 따라 다름) : 당신은 아래로 커서 여러 줄로 이동 텍스트이지만 커서는 화면 중간에 머물러 있습니다.

마찬가지로 Ctrl 키를 - U 14k14<C-y> 같은 작동합니다.

부록 : 화면에 30 줄이 있으면 그 둘은 완전히 동일합니다.

+1

더 정확하게 : [카운트] 및 [카운트] 은 그가 원하는 것입니다. – ciastek

+0

@ciastek 당신은 대답을해야합니다. – Zenexer

0

에서이 매핑을 사용해보세요.vimrc에

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

이 커서 화면의 위치를 ​​변경하지만, 화면의 위치에 커서 라인을 변경하지 않는다 : 이것은 그러나 scroll 옵션을 재설정

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

, 그래서 이후 <C-D><C-U> 스크롤 화면 절반. set scroll=0이 없으면 scroll 옵션이 1로 설정되고 그 다음에 <C-D><C-U>이 한 줄씩 스크롤됩니다 (Vim은 이상 함).

아마 1<C-D>1<C-U>에 기반한 Vimscript 기능이 가장 좋을 것입니다.

0

내가 아는 두 가지 방법이 있습니다. 당신의 .vimrc 파일에 다음 줄을 추가합니다 (하나의 두 가지 방법 중 선택) :

방법 1 :이 화면 상단 봇과 GK로 이동합니다 일반 H, L를 사용

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 명령은 실제 ​​줄 대신 스크린 줄로 아래로 이동합니다. 라인이 화면 너비보다 길고 워드 랩이 켜져있을 때 올바르게 작동하는 것보다 복잡합니다.

또는 (이전 스택 교환 정력 팁 위키과에 게시 된)이 방법

" 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> 

내가 두 번째 방법이 유일한 문제는 라인이있는 경우입니다 : 2

방법 화면 너비보다 길고 단어 랩핑이 켜지면 커서는 줄 바꿈에서 여분의 줄을 차지하기 위해 커서를 위아래로 움직일 수 있습니다. 또한 파일의 상단과 하단에 커서를 이동할 수 있습니다. 첫 번째 방법은 실제로 모든 경우에 커서를 절대 이동하지 않으려 고합니다.

+0

답변에 대한 자세한 설명을 제공해 주시겠습니까? 그렇지 않으면 나중에 오는 사람에게는 아무런 의미가 없습니다. –

+0

글쎄,이 줄을 .vimrc 파일에 추가합니다.wordwrap이 꺼져있을 때 또는 커서가 켜져 있지만 선이 모두 창 너비보다 짧을 때 커서를 움직이지 않고 스크롤하는 것이 매우 간단합니다. 그러나 단어 랩이 켜져 있고 줄이 창 너비보다 길면 스크롤을 사용하면 커서가 줄을 따라 아래로 또는 위로 이동하면서 커서를 위아래로 움직일 수 있습니다. 맨 위 방법은 무엇을 상관없이 커서 위치를 유지하지만 정상 모드에서만 사용합니다. –

+0

정상 H가 맨 위 줄로 이동하고 보통 L이 맨 아래 줄로 이동하면 화면 줄을 스크롤 한 다음 다시 원래 화면으로 돌아 가기 위해 "gj"또는 "gk"로 몇 줄의 스크린 줄을 사용할 수 있는지 알아낼 수 있습니다 선. –