711

我最近发现了 Vim 的Ctrl+ECtrl+Y快捷方式,它们分别以一行的步长向上和向下移动屏幕,而不移动光标

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

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

有任何想法吗?

4

14 回答 14

1018
  • zz- 将当前行移动到屏幕中间
    小心zz,如​​果你不小心Caps Lock打开了,你会保存并退出vim!)
  • zt- 将当前行移动到屏幕顶部
  • zb- 将当前行移动到屏幕底部
于 2010-08-11T13:34:12.810 回答
724

此外:

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

Ctrl-y并且Ctrl-e仅在光标移出屏幕时才更改光标位置。

www.lagmonster.org/docs/vi2.html提供

于 2012-06-27T21:43:31.963 回答
45

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

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
于 2010-08-11T13:25:56.067 回答
21

这是我在 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

使光标停留在屏幕中间,屏幕上下移动。

于 2017-05-10T09:33:47.180 回答
21

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

:set so=999

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

于 2019-08-12T03:10:11.323 回答
19

Ctrl使用+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,时将光标留在同一列gg

您应该定义以下选项:

:set nostartofline
于 2016-02-18T07:35:28.000 回答
17

我过去使用过这些快捷键(注意: 单独的击键,即点击z,松开,点击后续键):

z t...或... z enter --> 将当前行移动到屏幕顶部

z z...或... z . --> 将当前行移动到屏幕中心

z b...或... z - --> 将当前行移至底部

如果不明显:

enter表示ReturnorEnter键。

.表示 DOT 或“句号”键 ( .)。

-表示连字符键 ( -)

值得一提的是,如果大写锁定打开,则z.可以避免因意外键入而保存和关闭 Vi 的危险。ZZ

更多信息::help scroll-cursor

于 2019-10-10T15:47:53.307 回答
8

我的滚动记忆...

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

+-------------------------------+
^                               |
|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                               |
+-------------------------------+

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

于 2020-03-09T20:24:17.000 回答
7

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

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

于 2017-03-03T13:23:59.617 回答
6

输入 vim 并键入:

:help z

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

z+- 重新绘制文件,光标位于窗口顶部,并在您的行的第一个非空白字符处。

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

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

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

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

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

于 2019-10-31T14:06:56.737 回答
4

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

您可以使用ScrollToPercent(0)from that question 来执行此操作。

于 2010-08-11T13:30:48.643 回答
4

zEnter正是这个问题所要求的。

它可以在奇怪地不起作用的地方zz工作(Ubuntu 2016.04 LTS 上的 vim 7.4.1689,没有特殊的 .vimrc)

于 2017-08-09T08:28:40.297 回答
2

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

scroll_mode.vim

于 2015-11-06T19:31:13.240 回答
1

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

在第一行光标、最后一行光标和中间光标之间快速切换也很容易,只需单击jk或者l在您处于插件模式时。

我想这里会很合适。

于 2018-04-18T05:46:12.240 回答