如何在Vim中移动屏幕而不移动光标?

我最近发现了Ctrl+ECtrl+Y Vim快捷键,它们分别用一行步骤不移动光标上下移动屏幕。

您是否知道任何将光标留在原地但移动屏幕以使具有光标的行成为第一行的命令?(拥有最后一行的命令将是一个很好的奖励)。

我可以通过手动按Ctrl+E(或Ctrl+Y)适当的次数来实现这一点,但是有一个直接执行此操作的命令会很好。

有什么想法吗?

193962 次浏览

Vim要求光标始终处于当前屏幕中,但是,您可以将当前位置添加书签滚动,然后返回到您所在的位置。

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g

您可能会发现“相对于光标滚动Vim,自定义映射”的答案很有用。

您可以使用该问题中的ScrollToPercent(0)来执行此操作。

  • zz-将当前行移动到中间 屏幕的
    小心zz,如果你碰巧打开了大写锁定,你将保存并退出vim!)
  • zt-移动当前行 到屏幕顶部
  • zb-移动 当前行到底部 屏幕

此外:

  • Ctrl-y将屏幕向上移动一行
  • Ctrl-e将屏幕向下移动一行
  • Ctrl-u将光标和屏幕向上移动1/2页
  • Ctrl-d将光标和屏幕向下移动1/2页
  • Ctrl-b将屏幕向上移动一页,光标到最后一行
  • Ctrl-f将屏幕向下移动一页,光标到第一行

Ctrl-yCtrl-e仅在光标移出屏幕时更改光标位置。

图片来源:www.lagmonster.org/docs/vi2.html

有时使用KJ键滚动文本很有用,所以我在我的. vimrc中有这个“滚动模式”功能(也绑定到z)。

scroll_mode.vim

当您使用Ctrl+DCtrl+FCtrl+BCtrl+UgHD0、D1、D2D2时,将光标留在同一列中

您应该定义以下选项:

:set nostartofline

您可以在光标移动命令的前缀加上一个数字,这将重复该命令很多次

1Ctrl+E会做Ctrl+E 10次而不是1次。

这是我在vimrc中的解决方案:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

这样光标就会停留在屏幕中间,屏幕会向上或向下移动。

z输入正是这个问题所要求的。

它适用于奇怪的zz不起作用(Ubuntu 2016.04 LTS上的vim 7.4.1689,没有特殊的. vimrc)

我写了一个插件,它使我能够在不移动光标位置的情况下导航文件。它基于折叠您的位置和目标位置之间的线条,然后跳过折叠,或者中止它,根本不移动。

当您处于插件模式时,只需单击jkl,即可轻松在第一行、最后一行和中间的光标之间快速切换。

我想这将是一个很好的适合这里。

我很惊讶没有人使用Scrolloff选项,它将光标保持在页面中间。 试试看:

:set so=999

这是Vim wiki上推荐的第一个方法,效果很好。

我过去使用过这些快捷键(注:单独按键,即点击z,放手,点击后续按键):

zt… or…z输入-->将当前行移动到屏幕顶部

zz… or…z.-->将当前行移动到屏幕中心

zb… or…z--->将当前行移到底部

如果不明显:

输入表示退货输入键。

.表示DOT或“完全停止”键(.)。

-表示HYPHEN密钥(-

为了它的价值,z.避免了保存和关闭Vi的危险,如果帽锁打开,则意外键入ZZ

更多信息::help scroll-cursor

输入vim并键入:

:help z

z是用于重绘的vim命令,因此它会相对于您定位光标的位置重绘文件。您拥有的选项如下:

z+-使用光标在窗口的顶部和行的第一个非空白字符重绘文件。

z--使用光标在窗口的底部和行的第一个非空白字符重绘文件。

z。-使用光标在窗口的中心和行的第一个非空白字符重绘文件。

zt-用光标在窗口的顶部重新绘制文件。

zb-用光标在窗口的底部重新绘制文件。

zz-用光标在窗口的中心重新绘制文件。

我的滚动记忆…

添加其他答案还要注意zezs,意思是:将屏幕移动到光标的左/右(不移动光标)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

还要查看hltb以及(使用qwertz键盘)c-ec-y(也是“y”以某种方式指向底部)在键盘上的位置,以记住屏幕在移动的位置。