在 vim 中自然滚动到最后一行的末尾

在 vim 中自然滚动到最后一行的末尾

我是一个 vim 新手,但我很难找到资源来帮助我解决这个问题。

当我将光标移动到文件底部时,我希望它继续越过最后一行,最好直到最后一行位于窗口顶部,但无限期也可以。我当前的解决方案包括输入set scrolloff=20my~/.vimrc然后执行G+zz来了解底部。但是,如果我向上和向下滚动,我就会再次将最后一行粘贴到底部。

我明白,因为文件后面没有换行符,所以它实际上没有任何可滚动的内容,但尽管如此,我无法使用窗口中间的底线来编辑文件,这很烦人。

所以最终我希望当我在底线时我可以按住它j,它就会向下滚动。有没有办法做到这一点?

答案1

我不认为这种行为有内置选项,但是在配置中使用一些键绑定,您可以将光标所在的行永久保留在中间(文件的前几行除外):

set scrolloff=99999

nnoremap <C-U> 11kzz
nnoremap <C-D> 11jzz
nnoremap j jzz
nnoremap k kzz
nnoremap # #zz
nnoremap * *zz
nnoremap n nzz
nnoremap N Nzz
nnoremap gg ggzz
nnoremap G Gzz
nnoremap gj gjzz
nnoremap gk gkzz

zz这映射了要在当前行之后执行并将屏幕居中的常见动作。请注意,这可能会导致速度较慢的终端(例如通过 ssh)闪烁,因为屏幕位置在再次居中之前实际上会跳回来。

答案2

您还可以将当前光标行移动到屏幕上的特定位置。

我用来<Ctrl-E>将当前行向上移动一行。

您还可以zt将当前行移至页面顶部。

更多信息这里

答案3

我找到了这个脚本https://www.vim.org/scripts/script.php?script_id=1649事实上,这比之前的答案效果更好。由于插入文本似乎会使滚动跳跃。

镜像在这里:https://github.com/vim-scripts/scrollfix

答案4

您可以在 上使用条件重映射j。如果您位于文档的最后一行,则映射j<C-e>.如果您在任何其他线路地图jj.

nnoremap <expr> j line(".") == line('$') ? '<C-e>':'j'

line(".") 返回当前行号,line("$") 返回最后一个行号。

相关内容