커서가 화면 중간에 있고 아래로 스크롤하면 커서가 화면에서 위쪽으로 이동합니다. 나는 그렇게하기를 원하지 않는다.커서 위치 변경없이 화면 이동
화면상의 커서 위치를 변경하지 않고 스크롤하는 방법은 무엇입니까?
솔루션, 대답 후 추가 :
noremap <C-k> 14j14<C-e>
noremap <C-l> 14k14<C-y>
커서가 화면 중간에 있고 아래로 스크롤하면 커서가 화면에서 위쪽으로 이동합니다. 나는 그렇게하기를 원하지 않는다.커서 위치 변경없이 화면 이동
화면상의 커서 위치를 변경하지 않고 스크롤하는 방법은 무엇입니까?
솔루션, 대답 후 추가 :
noremap <C-k> 14j14<C-e>
noremap <C-l> 14k14<C-y>
둘 다 커서 및 화면의 아무 곳에서 커서를 뷰포트를 이동하려면, 아마 당신은 한 번에 두 가지를 모두 수행하는 일부 사용자 지정 키 바인딩을 설정해야합니다 .
같은 :
:nnoremap <C-M-u> j<C-e>
이 (j
를) 커서를 아래로 이동하고 Ctrl-Alt-u
(만 일반 모드)를 누를 때마다 뷰포트 (Ctrl-e
)를 이동합니다. - E 및 Ctrl 키 - Y 스크롤 창에 커서의 위치를 이동하지 않고 버퍼 Ctrl 키를 :
은 내가 생각할 수있는 두 가지 방법이 있습니다. 나는 그것이 당신이 원하는 것이라고 생각합니다. E 및 Ctrl 키 - - 이동 키 Y 당신은 많은 수의 scrolloff
를 설정하는 경우 또한, 당신은 Ctrl 키와 같은 효과를 얻을 것이다. scrolloff
설정은 창을 기준으로 커서가 수직으로 이동하는 것을 어렵게 만듭니다. (뭔가 :set so=999
처럼 so
는 scrolloff
의 약어 인을 사용합니다.)
:help 'scrolloff'
:help scrolling
'ctrl-E' ** **는 커서의 위치를 창에 상대적으로 이동 시키며 커서는 텍스트를 따라갑니다. 커서가 윈도우/스크린의 중간에 있고'ctrl-E '를 반복해서 누르면 커서가 첫 번째 라인으로 이동합니다; 이것은 정확히 구두꾼이 원하지 않는 것입니다; 그는'14j14
두번째 제안, scrolloff 설정, op가 요구하는대로 **는 ** 같은 효과를주지 않습니다. 'ctrl-E'; scrolloff와 관련된 문제는 스크롤하지 않고 이동할 수 없다는 의미에서 영구적이라는 것입니다. 하나의 키를 가지고 이동하고 스크롤하지 않고 이동하는 것이 좋을 것입니다. –
'so' 옵션에 대한 Upvote가 있지만 @ Matthias009가 맞습니다. –
Ctrl 키를 - D 및 Ctrl 키 - U 당신이 원하는 것입니다.
Ctrl 키를 - D가 14j14<C-e>
것과 같은 효과가있다 (수 (14)가 하드 코딩되지 않은 단지를 움직임의 양이 화면의 실제 크기에 따라 다름) : 당신은 아래로 커서 여러 줄로 이동 텍스트이지만 커서는 화면 중간에 머물러 있습니다.
마찬가지로 Ctrl 키를 - U 14k14<C-y>
같은 작동합니다.
부록 : 화면에 30 줄이 있으면 그 둘은 완전히 동일합니다.
에서이 매핑을 사용해보세요.vimrc에
map <ScrollWheelUp> 5<C-Y>
map <ScrollWheelDown> 5<C-E>
이 커서 화면의 위치를 변경하지만, 화면의 위치에 커서 라인을 변경하지 않는다 : 이것은 그러나 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 기능이 가장 좋을 것입니다.
내가 아는 두 가지 방법이 있습니다. 당신의 .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
방법 화면 너비보다 길고 단어 랩핑이 켜지면 커서는 줄 바꿈에서 여분의 줄을 차지하기 위해 커서를 위아래로 움직일 수 있습니다. 또한 파일의 상단과 하단에 커서를 이동할 수 있습니다. 첫 번째 방법은 실제로 모든 경우에 커서를 절대 이동하지 않으려 고합니다.
답변에 대한 자세한 설명을 제공해 주시겠습니까? 그렇지 않으면 나중에 오는 사람에게는 아무런 의미가 없습니다. –
글쎄,이 줄을 .vimrc 파일에 추가합니다.wordwrap이 꺼져있을 때 또는 커서가 켜져 있지만 선이 모두 창 너비보다 짧을 때 커서를 움직이지 않고 스크롤하는 것이 매우 간단합니다. 그러나 단어 랩이 켜져 있고 줄이 창 너비보다 길면 스크롤을 사용하면 커서가 줄을 따라 아래로 또는 위로 이동하면서 커서를 위아래로 움직일 수 있습니다. 맨 위 방법은 무엇을 상관없이 커서 위치를 유지하지만 정상 모드에서만 사용합니다. –
정상 H가 맨 위 줄로 이동하고 보통 L이 맨 아래 줄로 이동하면 화면 줄을 스크롤 한 다음 다시 원래 화면으로 돌아 가기 위해 "gj"또는 "gk"로 몇 줄의 스크린 줄을 사용할 수 있는지 알아낼 수 있습니다 선. –
커서를 스크롤하거나 현재 행의 커서를 이동하지 않고 화면을 스크롤 할 수 있습니다 (선이 움직이기 때문에 화면에서 움직일 수는 있지만). 나는 당신이 찾고있는 것을 정확히 성취 할 수 있다고 생각하지 않는다 ... 단지 페이지를 때리면 어떨까요? ... – Fosco
페이지가 아래로 움직이는 것은 단지 더 큰 움직임입니다. –
이것은 다음을 반복합니다 : http://stackoverflow.com/questions/3458689/how-to-move-screen-without-moving-cursor-in-vim/ – GWW