ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有任何想法吗?


E
Eduardo Cuomo

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 - 固定光标并将屏幕移动到顶部/中心(德语:'zentrum')/底部 <---> H / M / L - 固定屏幕并将光标移动到高/中/低位置
我更喜欢 z. 而不是 zz,以防你碰巧有大写锁定,zz 不会那么友好。
M
Matthias Braun

此外:

Ctrl-y 将屏幕上移一行

Ctrl-e 屏幕下移一行

Ctrl-u 将光标和屏幕向上移动 ½ 页

Ctrl-d 将光标和屏幕向下移动 ½ 页

Ctrl-b 将屏幕上移一页,光标到最后一行

Ctrl-f 屏幕下移一页,光标到第一行

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

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


@ulidtko:efter(瑞典语后),yore(意为过去),上、下、后、前。 (back and forward 比 up and down 长,所以它们自然会移动屏幕更远的距离;)
我猜是昨天,不过会是一个更好的助记符^^
Ctrl-u 和 Ctrl-d 都移动光标:“光标在文件中向上移动相同数量的行(如果可能;当换行时和到达文件末尾时可能会有所不同)。”
:help CTRL-EMnemonic: Extra lines.
对于助记符,我认为 Ctrl-b : back Ctrl-f : forward Ctrl-u : up Ctrl-d : down Ctrl-yCtrl-e 有点绝望,但它们在 u 'up' 和 d 'down' 旁边所以这几乎是最接近的?
G
GWW

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 转到标记就完成了。现在您可以调用可配置的键来四处走动,感觉就像光标从未离开过当前位置。瞧!
t
the Tin Man

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

:set so=999

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


如果您不希望光标总是在中间right,您可以将其设置为较小的值。例如,:set scrolloff=4 将要求光标始终距离窗口顶部或底部至少 4 行,因此您始终至少有一点上下文。
这很漂亮
t
the Tin Man

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

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

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

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

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

如果不明显:

enter 表示 Return 或 Enter 键。

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

- 表示连字符键 (-)

对于它的价值,z。如果大写锁定打开,则通过意外键入 ZZ 来避免保存和关闭 Vi 的危险。

更多信息::help scroll-cursor


这些很棒,z 然后 t 对我的小树桩来说有点牵强🤸‍♂️
A
Alexander Rumyantsev

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

您应该定义以下选项:

:set nostartofline

我每次都忘记/混淆它:zt / zz / zb - 固定光标并将屏幕移动到顶部/中心(德语:'zentrum')/底部 <---> H / M / L - 固定屏幕并将光标移动到高/ 中 / 低位
M
MacMartin

我的滚动记忆...

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


y
yunzen

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

10Ctrl+E 将执行 Ctrl+E 10 次而不是 1 次。


Y
Yusuf Adeyemo

输入 vim 并键入:

:help z

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

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

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

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

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

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

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


N
Nicolas Raoul

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

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


t
the Tin Man

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

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


C
Community

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

请参阅scroll_mode.vim


t
the Tin Man

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

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

我想这里会很合适。