Vim:将光标移至最后一个位置


251

(g)Vim中是否可以将光标移动到其先前位置(在正常模式下)?在上一个光标位置列表中来回循环的操作是理想的。而且只需切换到最后一个位置就足够了(就像cd -在带有目录的bash中一样)。

这是一个小示范:

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

假设我做了2j,现在是这样:

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

现在,我想按一下(不是2k很明显的东西)以移回第一位置,也可能移至先前的位置。

Answers:


409

最快的方法是:

''

(两个撇号)或:

``

(两个反引号)。请注意,不同之处在于反引号移至行中的相同位置,而撇号则移至行的开头。在英国键盘上,撇号更易于访问,因此我倾向于使用该撇号。有很多有用的标记,例如,请参见:help mark-motions

对于其他一些动作(2j我认为不是),还有一个跳转列表,可让您在多个动作之间来回导航。 CtrlOCtrlI进行此导航,但请参阅:help jump-motions参考资料。


3
实际上,这些行为都不像我期望的那样,但是我想没有其他可用的方法了。
Idan K

1
@Idan K-``(双引号)不能完全给您您想要的东西吗?(“历史”方面除外)。

3
@Dan:如果我在上面的示例中尝试过,那么我会看到以下行为:我站在第1行,然后j连续按两次(现在我在第3行),然后按double backtick进入我的第1行,我期望它移动到第2行
伊詹ķ

2
我认为您必须先移动(2j之类的东西),然后进行编辑(或执行任何操作来修改文本),然后使用''返回到先前的位置。使用“ 2j”不合逻辑,什么也不做,然后返回到先前的位置
Asenar 2013年

8
@IdanK仅当您使用实际的“跳转”(即我认为)是除i j k l运动以外的任何运动命令时,才会更新跳转列表(即,记录了先前的光标位置)。(来自帮助文档的完整列表为"'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file。)因此,这不会“撤消” 2j或类似操作,但几乎可以用于其他所有功能。这是有道理的,因为2j等。已经具有简单的反转(2k,等),而其他的则没有。
Kyle Strand

61

您也可以在上一个编辑位置的列表中使用g;g,来回移动。

在非美国键盘上

在我的瑞士和德国键盘布局上,键入;不便需要使用Shift按键。因此,我定义g-为一个更方便的别名g;$MYVIMRC

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

虽然我很喜欢,但它只会在一个文件的更改之间跳转。如果编辑缓冲区1,然后缓冲2编辑,也不会跳回到缓冲1
thouliha

39

为什么没人能用DrAl的答案解决问题?该''``不会解决这个帖子的原始问题!2j至少对于我来说,这两个命令不适用于某些光标移动。这会让新手更加困惑。

''``,和CtrlI或的行为 CtrlO基于跳转列表。该2j不会保存位置改变到跳转列表,以便这些命令不会工作2j

''``在最后位置和当前位置之间切换。 CtrlICtrlO查看跳转列表的历史记录。

g;g,浏览也经常使用的编辑位置。


1
感谢您指出了这一点!我想知道,那么对于,该怎么2j办?

33

从帮助开始(:help jump):

:ju [mps]打印跳转列表(不是运动命令)。{Vi无此功能} {如果没有| + jumplist |,则不可用 特征}

                          *jumplist*

跳转记忆在跳转列表中。使用CTRL-O和CTRL-I命令,您可以在较旧的跳转之前转到光标位置,然后再次返回。因此,您可以在列表中上下移动。每个窗口都有一个单独的跳转列表。条目的最大数量固定为100。{如果没有| + jumplist |,则不可用。特征}

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.