如何在 Vim 中滚动(向上/向下移动屏幕,同时光标保持固定在同一屏幕位置)

问题描述 投票:0回答:3

在网页上正常滚动时,光标保持在屏幕上的同一位置,同时屏幕平滑地上下移动。我想在 vim 中复制该功能。 Ctrl-YCtrl-E 移动屏幕,但光标不会停留在屏幕上的同一位置,而是停留在同一行。

到目前为止,唯一接近的是 Ctrl-UCtrl-D,但这会滚动屏幕一半的行数。这无法实现平滑滚动。

有内置命令吗?

答案后添加解决方案: 不,没有默认的方法可以做到这一点。但有这些方便的映射:

nnoremap <C-K> k<C-Y>

nnoremap <C-J> j<C-E>

vim screen text-cursor
3个回答
0
投票

'scroll'
选项决定Ctrl-UCtrl-D滚动的行数。
0
默认为“半个屏幕”;但如果你

:set scr=1

那么这些命令只会让你移动一行。 (您可以使用

:set scr=0
恢复默认值。)

请注意,

'scroll'
选项是通过在Ctrl-UCtrl-D前加上计数来自动设置的。 IE。如果您执行 1Ctrl-D,则每进一步 Ctrl-UCtrl-D 只会移动一行,直到
'scroll'
重置。

另一种可能性是

'scrolloff'
,它确定窗口中光标上方和下方的最小行数。将其设置为一个可笑的数字将确保您的光标始终位于屏幕中央。也就是说,

:set so=999

事实上会将

j
k
转换为您想要的内容。

最后,如果您不喜欢这两种方法的副作用,那么像 Christian Gibbons 在评论中建议的绑定是另一种方法。


0
投票

由于没有默认的方法,所以我选择使用

nnoremap <C-K> k<C-Y>

nnoremap <C-J> j<C-E>


0
投票

您只需将

set scroll=1
添加到您的
~/.vimrc
,然后分别使用 Ctrl+DCtrl+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
,例如在关闭帮助窗口后。

© www.soinside.com 2019 - 2024. All rights reserved.