【问题标题】:How to move screen without moving cursor in Vim?如何在 Vim 中移动屏幕而不移动光标?
【发布时间】:2011-03-28 09:15:22
【问题描述】:

我最近发现了 Vim 的 Ctrl+ECtrl+Y 快捷键可以分别向上移动屏幕并向下移动一行,不移动光标

你知道有什么命令可以将光标留在原处但移动屏幕以使有光标的行成为第一行吗? (最后一行有一个命令将是一个不错的奖励)。

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

有什么想法吗?

【问题讨论】:

  • 这个问题不应该在 Vim 部分吗?

标签: vim scroll cursor-position


【解决方案1】:
  • zz - 将当前行移到中间 屏幕的
    小心 zz,如果你碰巧有 Caps Lock不小心会保存退出vim!)
  • zt - 移动当前行 到屏幕顶部
  • zb - 移动 当前行到底部 屏幕

【讨论】:

  • @HappyGreenKidNaps 映射锁定键以尽快控制!
  • 我非常喜欢我的大写锁定,尤其是处理大量 C 宏,但您还有其他选择。首先,找到一个未映射的键(检查两个大小写的字母;尝试添加修饰符或前导符,使用符号或功能键等)并将其映射到区分大小写的“风险”组合。其次,根据自己的喜好配置 vimundo,以便从 oops 中恢复。 (非便携式黑客传入:)第三,做同样的事情,但从您的用户键盘配置,例如Windows键+ Z;对于序列的映射,请尝试 xdotooltriggerhappy。最后,显示你的大写锁定状态(不能在 Vimscript 中完成。)...
  • 查询大写锁定状态非常依赖环境。我听说它不能在 Vimscript 中完成,在这一点上我已经接受了。如果你想走这条路,有xev -qcat /proc/bus/input/devices来查找要查询的设备,evtestthd ... --dump /dev/input/event<#>来检查状态等。如果你绝对必须进行系统范围的重新映射,在至少交换两个锁,如 caps num - 但问题更多的是忘记它已打开,因为如果你以前想要它,你会继续使用它,无论是什么地图。在文件/用户/系统之前破坏 Vim 的风险。
  • zt / zz / zb - 固定光标并将屏幕移动到 top/center(german:'zentrum')/ bottom H / M / L - 固定屏幕并将光标移动到 High / Middle / L当前位置
  • 我更喜欢z. 而不是zz,以防你碰巧有大写锁定,zz 不会那么友好。
【解决方案2】:

另外:

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

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

感谢www.lagmonster.org/docs/vi2.html

【讨论】:

  • @ulidtko: efter(瑞典语后),yore(意为过去),上、下、后、前。 (前后两个字比上下长,所以自然会移动屏幕更远的距离;)
  • 我猜是昨天,虽然昨天会是一个更好的助记符^^
  • Ctrl-u 和 Ctrl-d 都移动光标:"光标在文件中向上移动相同的行数(如果可能的话;当换行时和到达末尾时文件可能有差异)。"
  • :help CTRL-EMnemonic: Extra lines.
  • 对于我想到的助记符 Ctrl-b :后退 Ctrl-f :前进 Ctrl-u :上 Ctrl-d :下 Ctrl-yCtrl-e 有点绝望,但他们在你旁边'up' 和 d 'down' 这样就差不多了?
【解决方案3】:

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

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

【讨论】:

  • 请注意,如果您只关心转到书签行,则可以使用 'g
  • "Vim 要求光标始终在当前屏幕上" Vim 用户喜欢吹嘘一切都可以在 vim 中配置。这个不是。我不想在滚动文件时移动光标。我的交易破坏者
  • 我从来没有遇到过我希望光标位于您看不到的地方的情况。当然,当你滚动时,光标会四处移动,但你可以回到原来的位置(这样你就可以看到你实际在哪里,而不仅仅是猜测)。一个双引号,Ctrl-O 另一个非常棒的,“反引号,句号”让您回到上次编辑的位置。
  • @gedalat,当您滚动离开时,其他编辑器非常烦人,不知道您的光标在哪里,并且必须使用鼠标单击某个地方才能让光标返回。或者您认为您在“这里”,开始输入并突然跳回光标所在的位置,此时您无法跳回您滚动的位置,因为只跟踪光标位置。让光标跟随你去的地方可以说是一件好事。
  • 它是可配置的,@gadelat。你只需要映射这个答案(用mg标记位置,滚动,用'g标记位置,你就完成了。现在你可以调用可配置的键来四处走动,感觉光标从未离开过当前位置。瞧!
【解决方案4】:

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

:set so=999

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

【讨论】:

  • 如果你不希望光标总是在中间right,你可以将它设置为一个较小的值。例如,:set scrolloff=4 将要求光标始终距离窗口顶部或底部至少 4 行,因此您始终至少有一点上下文。
【解决方案5】:

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

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

【讨论】:

  • 我认为这个解决方案更符合 OP 的需要。我应用了它,它就像一个魅力。
  • 将'scrolloff'设置为'lines'值的一半怎么样?
  • 不幸的是,"nnoremap o ozza" 丢失了自动缩进,但这可以通过添加和删除临时字符 '.' 来解决它。 "nnoremap o o.zzxa"
【解决方案6】:

当您使用 Ctrl+DCtrl+F 时,要将光标留在同一列, Ctrl+B, Ctrl+U, G, H、MLgg

您应该定义以下选项:

:set nostartofline

【讨论】:

  • 我每次都忘记/混淆它:zt / zz / zb - 固定光标并将屏幕移动到 top/center(german:'zentrum')/ bottom H / M / L - 固定屏幕并将光标移动到 High / Middle / 位置
【解决方案7】:

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

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

z z ...或... z . --> 将当前行移至中心屏幕尺寸

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

如果不明显:

enter 表示 ReturnEnter 键。

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

- 表示连字符键 (-)

不管怎样,z. 避免了因意外键入 ZZ而导致保存和关闭 Vi 的危险> 如果大写锁定打开。

更多信息::help scroll-cursor

【讨论】:

  • 这些很棒,z 然后t 对于我的小树桩来说有点牵强?‍♂️
【解决方案8】:

我的滚动助记符...

添加到其他答案还要注意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”以某种方式指向底部)键盘记住屏幕移动的位置。

【讨论】:

    【解决方案9】:

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

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

    【讨论】:

      【解决方案10】:

      输入 vim 并输入:

      :help z

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

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

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

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

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

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

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

      【讨论】:

        【解决方案11】:

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

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

        【讨论】:

          【解决方案12】:

          您可能会发现“Scrolling Vim relative to cursor, custom mapping”的答案很有用。

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

          【讨论】:

            【解决方案13】:

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

            scroll_mode.vim

            【讨论】:

              【解决方案14】:

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

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

              我想这里很适合。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-31
                • 1970-01-01
                • 2014-07-04
                • 1970-01-01
                相关资源
                最近更新 更多