如何在Vim中不移动光标的情况下移动屏幕?


598

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

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

我可以通过按适当的次数手动按Ctrl+ E(或Ctrl+ Y)来实现此目的,但是使用某种直接执行此命令的命令会很好。

有任何想法吗?


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

Answers:


877
  • zz-将当前行移动到屏幕的中间
    注意zz,如果Caps Lock偶然碰巧,您将保存并退出vim!)
  • zt -将当前行移到屏幕顶部
  • zb -将当前行移到屏幕底部

9
@HappyGreenKidNaps映射的地图具有锁定键来尽快控制!
亚伦

我非常喜欢大写锁定,尤其是处理很多C宏时,但是您还有其他选择。首先,找到一个未映射的键(检查两个字母是否大小写;尝试使用符号或功能键等添加修饰符或首字母)并将其映射到区分大小写的“风险”组合。其次,根据自己的喜好配置vimundo,以便您可以从oops中恢复。(非便携式黑客入侵:)第三,做同样的事情,但是要通过用户键盘配置,例如Windows键+ Z;要映射到序列,请尝试xdotooltriggerhappy。最后,显示您的大写锁定状态(无法在Vimscript中完成。)……
John P

2
查询大写锁定状态非常依赖于环境。我听说它不能在Vimscript中完成,因此我已经接受了。如果您想走这条路,这里有xev -qcat /proc/bus/input/devices查找要查询的设备和/ evtestthd ... --dump /dev/input/event<#>检查状态等信息。如果您绝对必须在系统范围内进行重新映射,请至少交换两个锁,例如caps <-> num-但是问题更是使人忘记了它的存在,因为如果您以前想要它,那么无论使用哪种地图,都将继续使用它。有在文件/用户/系统之前破坏Vim的风险。
约翰·P

其他Vim脚本选项:打开'confirm'确认退出/离开/等。对于写作,我相信您需要使用的BufWritePre自动命令confirm()。另外,除了将大写锁定映射到ctrl外,还可以将其映射到Vim理解但未映射的键或组合,然后在插入/替换模式下手工或通过类似github.com/tpope/的方式模拟大写锁定。vim-capslock。您可能在Vim之外不需要它,但是如果需要,可以编写一个xmodmap脚本来还原您的更改,或者查看该程序是否支持自己的映射(并做笔记。)
John P

3
ZT / ZZ / ZB -固定光标和移动画面 OP /中心(德语: ' Ž entrum')/ b ottom <---> H / M / L -固定屏幕和移动光标到ħ IGH / 中号 iddle / 大号嗷嗷位置

626

另外:

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

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

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


91
@ulidtko:efter(后为瑞典语),yore(表示过去),上,下,后退,前进。(前后的单词比上下的单词长,因此自然地它们
会将

12
我想是的,虽然昨天会更好,但是^^
Moberg

Ctrl-u和Ctrl-d都移动光标:“ 光标在文件中向上移动相同的行数(如果可能;当行换行并且到达文件末尾时,可能会有所不同)。
Lex R

感谢@LexR,我已经更新了答案以反映这种区别。
保罗·惠勒

1
:help CTRL-EMnemonic: Extra lines.
Niko Bellic

39

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

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

1
请注意,如果您只关心转到加书签的行,则可以使用'g
Matt Briggs

4
“ Vim要求光标始终处于当前屏幕中。” Vim用户喜欢吹嘘一切都可以在vim中进行配置。这不是。在浏览文件时,我不希望光标移动。对我来说是
破坏交易者

8
我从来没有遇到过我希望光标位于您看不见的地方的情况。当然,滚动时光标会四处移动,但是您可以返回到平时的位置(这样您就可以看到实际的位置,而不仅仅是猜测)。两次后退,然后再Ctrl-O进行一次非常出色的操作,而“后退,句号”则使您回到上次编辑的位置。
dash-tom-bang

3
@gedalat,当您滚动离开时,这在其他编辑器中是非常烦人的,不知道光标在哪里,必须使用鼠标单击某个位置才能使光标返回。或者,您认为自己在“这里”,开始键入,它突然跳回到光标所在的位置,此时您无法跳回到滚动的位置,因为只跟踪了光标位置。让光标跟随您的去向无疑是一件好事。
Shahbaz

1
它是可配置的,@ gadelat。您只需要映射这个答案(用标记位置mg,滚动,用标记位置,'g就可以了。现在,您可以调用可配置的键来移动,这就像光标从未离开当前位置。Voilá!
Beco博士

18

这是我在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需要的。我应用了它,它就像一个魅力。
古斯塔沃·平沙德

9
将“ scrolloff”设置为“ lines”值的一半怎么样?
rld。

不幸的是,“ nnoremap o <ESC> zza”会丢失自动缩进,但是可以通过添加和删除临时字符'。来解决此问题。“ nnoremap o o。<ESC> zzxa”
Neil McGill

谢谢@rld,“滚动”也是一个不错的选择,也可能是更好的选择。谢谢!参考如下:vim.wikia.com/wiki/…–
亨利

14

要光标停留在相同的列当您使用Ctrl+ DCtrl+ FCtrl+ BCtrl+ UGHMLgg

您应该定义以下选项:

:set nostartofline

2
我每次都会忘记/混淆它:zt / zz / zb-​​固定光标并将屏幕移动到t op / center(德语:“ z entrum”)/ b底部<---> H / M / L-固定屏幕并移动光标ħ IGH / 中号 iddle / 大号流位置
埃利

8

令我惊讶的是,没有人使用该Scrolloff选项将光标停留在页面中间。尝试使用:

:set so=999

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


3
如果你不希望永远光标是正确的在中间,你可以将其设置为较小的值。例如,:set scrolloff=4将要求光标始终与窗口的顶部或底部至少相隔4行,因此您始终至少要有一点上下文。
索伦·比约恩斯塔德

6

我过去使用过这些快捷方式(请注意: 单独的按键,即点击z,放开,点击下一个按键):

z enter ->将当前行移到屏幕顶部

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

z - ->将当前行移到底部

如果不明显:

enter表示ReturnEnter键。

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

-表示连字符(-

不管用什么方法,如果打开大写锁定时z.,不小心输入,可以避免保存和关闭Vi的危险ZZ


5

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

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





2

我的滚动助记符...

除其他答案外,还要注意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                               |
+-------------------------------+

还要查看键盘上hand ltand b和(使用qwertz键盘)c-ec-y(也可能是“ y”指向底部)在键盘上的位置,以记住屏幕的移动位置。


1

我写了一个插件,使我可以在不移动光标位置的情况下浏览文件。它基于折叠您的位置和目标位置之间的线,然后跳过该折叠,或者中止该折叠并且完全不移动。

这也很容易在中间光标在第一行,最后一行和光标之间快速切换,只需点击jkl当你在插件的模式。

我想这将是一个很好的选择。


1

输入vim并输入:

:help z

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

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.