Vim: 将光标移动到上次停留的位置

313

在(g)Vim中,是否可以将光标移动到其先前的位置(在普通模式下)?最好能够循环在先前光标位置列表之间切换。但是仅切换到最后一个位置也足够了(类似于bash中的cd -与目录)。

这里是一个小演示:

line |1| <- cursor position
line 2
line 3
line 4

假设我执行了2j,现在的情况如下:

line 1
line 2
line |3| <- cursor position
line 4

现在我想按下某个东西(除了显然的2k),以回到第一个位置并可能返回之前的位置。

4个回答

510

最快的方式是按下:

''

(两个撇号) 或者:

``

(两个反引号)。请注意,它们的区别在于反引号跳到同一行的相同位置,而撇号跳到行首。在英国键盘上,撇号更容易访问,所以我倾向于使用那个。还有很多像这样有用的标记,参见:help mark-motions

对于其他一些动作(不是2j),还有一个跳转列表,让您在多个动作之间前后导航。CtrlOCtrlI 进行此导航,但有关更多信息,请参见:help jump-motions


7
实际上,这些都没有完全按照我的预期表现,但我想可能没有其他可用的选择了。 - Idan K
1
@Idan K - 双反引号 `` 不是给你想要的吗?(除了“历史”方面)。 - Dan
7
@Dan:如果我在上面的例子中尝试,我会看到这种行为:我站在第1行,然后按两次“j”键(现在我在第3行),然后再按两次重音符号回车,它会把我带到第1行,但我期望它应该移到第2行。 - Idan K
2
我认为你必须移动(2j 或其他),然后编辑(或执行任何修改文本的操作),然后使用 '' 移回到先前的位置。使用“2j”什么也不做并返回到以前的位置是不合逻辑的。 - Asenar
13
@IdanK 只有在使用实际“跳转”(即除了 i j k l 移动命令之外的任何运动命令)时,跳跃列表才会更新(例如记录上一个光标位置)。根据帮助文档中的完整列表来看,“跳转”命令包括 "'"', "\", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" 以及开始编辑新文件的命令。因此,不,这不会“撤消” 2j 或类似操作,但它几乎对其他所有操作都有效。这是有道理的,因为 2j 等已经有简单的反向操作(例如 2k),而其他操作则没有。 - Kyle Strand
显示剩余3条评论

84

您也可以使用g;g,来在您之前编辑位置的列表中向后和向前移动。

在非美国键盘上

在我的瑞士和德国键盘布局中,键入;需要使用Shift键,这很不方便。因此,我在$MYVIMRC中定义了g-作为g;更方便的别名:

" Map g- as an alias for g;
nnoremap g- g;

1
虽然我非常喜欢这个功能,但它只能在一个文件的更改之间跳转。如果您编辑缓冲区1,然后编辑缓冲区2,它不会跳回到缓冲区1。 - dessalines

74
为什么没有人发现DrAl的回答中的问题呢? ''``不能解决这篇文章中提出的原始问题! 这两个命令不能用于一些光标移动,例如2j,至少对我来说是这样的。它们会让vim新手更加困惑。 ''``的行为以及CtrlICtrlO是基于跳转列表的。在2j时不会将位置更改保存到跳转列表中,因此这些命令无法用于2j''``在上一个位置和当前位置之间切换。 CtrlICtrlO通过跳转列表历史记录工作。 g;g,移动到编辑位置,这也是非常常用的。

11
谢谢你指出这个问题!我在想,对于像2j这样的情况,应该使用什么方法呢? - user8554766
谢谢@ZhaoGang,这正是我在寻找的! - Lambdaphile
不是每个动作都需要花哨的东西。如果我执行了2j,想要回去,我可以说2k :) - gbarry

36

从帮助中得知 (:help jump):

:ju[mps] 打印跳转列表(不是运动命令)。 {在Vi中不可用} {需要启用 |+jumplist| 功能}

                          *jumplist*

跳转被记在跳转列表中。使用CTRL-O和CTRL-I命令可以前往旧的跳转位置并返回,因此您可以在列表中上下移动。每个窗口都有一个单独的跳转列表,最大条目数限制为100。 {没有启用|+jumplist|功能则不可用}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接