在网页上正常滚动时,光标保持在屏幕上的同一位置,同时屏幕平滑地上下移动。我想在 vim 中复制该功能。 Ctrl-Y 和 Ctrl-E 移动屏幕,但光标不会停留在屏幕上的同一位置,而是停留在同一行。
到目前为止,唯一接近的是 Ctrl-U 和 Ctrl-D,但这会滚动屏幕一半的行数。这无法实现平滑滚动。
有内置命令吗?
答案后添加解决方案: 不,没有默认的方法可以做到这一点。但有这些方便的映射:
nnoremap <C-K> k<C-Y>
和
nnoremap <C-J> j<C-E>
'scroll'
选项决定Ctrl-U和Ctrl-D滚动的行数。 0
默认为“半个屏幕”;但如果你
:set scr=1
那么这些命令只会让你移动一行。 (您可以使用
:set scr=0
恢复默认值。)
请注意,
'scroll'
选项是通过在Ctrl-U或Ctrl-D前加上计数来自动设置的。 IE。如果您执行 1Ctrl-D,则每进一步 Ctrl-U 或 Ctrl-D 只会移动一行,直到 'scroll'
重置。
另一种可能性是
'scrolloff'
,它确定窗口中光标上方和下方的最小行数。将其设置为一个可笑的数字将确保您的光标始终位于屏幕中央。也就是说,
:set so=999
事实上会将
j
和 k
转换为您想要的内容。
最后,如果您不喜欢这两种方法的副作用,那么像 Christian Gibbons 在评论中建议的绑定是另一种方法。
由于没有默认的方法,所以我选择使用
nnoremap <C-K> k<C-Y>
和
nnoremap <C-J> j<C-E>
您只需将
set scroll=1
添加到您的 ~/.vimrc
,然后分别使用 Ctrl+D 和 Ctrl+U 上下滚动窗口。
不过,使用
set scroll=1
的麻烦在于,只要当前窗口大小发生变化,例如使用 0
打开内置帮助时,或者使用 :h scroll
浏览搜索历史记录时,该值就会重置为
q/
.
为了在所有窗口中保留
scroll
设置并在所有窗口大小更改后,我在我的 ~/.vimrc
中实现了此 vimscript 代码:
set scroll=1
function! PreserveScroll(timer)
set scroll=1
endfunction
augroup vimrc-preserve-scroll
autocmd!
autocmd VimResized * set scroll=1
autocmd WinEnter * set scroll=1
autocmd WinLeave * call timer_start(300, "PreserveScroll", {"repeat": 3})
augroup END
显然,设置计时器不是最好的解决方案,但不幸的是,我没有看到更好的方法来在返回窗口时执行
set scroll=1
,例如在关闭帮助窗口后。