我经常对大文件的中间进行更改,使用gg跳到顶部检查某些内容,然后意识到我忘了在编辑位置设置标记。是否有内置的方法可以跳转到最后更改的行的位置?

#1 楼

`.命令将带您到最后一次更改。有关更多信息,请参见`

还有.,它将带您回到上一次跳转之前的光标位置。有关更多信息,请参见:help :help `.

另一个有用的标记是``;这是上次停止插入模式时光标所在的位置。请参阅``

有关使用标记(包括一些其他自动设置的“特殊”标记)的常规信息,请参见`^

评论


您也可以使用g;和g,在更改列表中的位置之间移动。见:h g;和:h g,

– Peter Rincker
2015年2月19日在23:21

您也可以使用'(撇号)代替`(反引号)。

– Sparhawk
16 Mar 7 '16 at 0:01

仅供参考,ideavim支持`。但不是g;。 VSCode vim都支持。

–pambda
20/11/15在9:34



#2 楼

这是适合您给定场景的另一种方法,它将跳转到gg之前的位置(而不是最后更改的行)。 />当您按gg时,您的旧光标位置将被推入跳转列表。从:help jumplist开始:


跳转列表中会记住跳转。使用CTRL-OCTRL-I
命令,您可以在较早的跳转之前转到光标位置,然后再次返回
。因此,您可以在列表中上下移动。每个窗口都有一个单独的
跳转列表。条目的最大数量固定为
100。

[…]

如果使用跳转命令,则当前行号将插入到
/>跳转列表的末尾。如果同一行已经在跳转列表中,则
将其删除。结果是,当重复CTRL-O时,您将只能回到原位置一次。 br />如果+jumplist打印:echo has('jumplist'),则可以使用它。

#3 楼

为了增加dnetserr的答案和Peter Rincker的评论,Vim会维护一个更改列表,并具有与此相关的一些命令。

:changes


将列出更改,向您显示在哪里他们过去和曾经是什么。例如:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>


>所在的行显示了更改堆栈中的位置,有点像跳转列表(:jumps)或标记堆栈(:tags)。就像跳转列表和标签栈一样,您也可以遍历该列表。在正常模式下,动作分别为g;和Q4312079q进入下一个更改位置。您也可以在g,g;之前键入更改的编号,以从列表中转到该更改。上面,g,将带我到发生涉及stdio.h的更改的地方。例如:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other


这表明我可以返回一个(2g;或仅:changes)或向前一个(1g;或仅g;)。

如果您要进行的更改实际上是在一些修改之前进行的,那么这很好,

这样的缺点是它看起来不像正常动作。例如,您无法执行1g,从光标删除到先前的更改位置,而g,dg;确实可以作为动作来使用。

#4 楼

g;将转到先前编辑的行。

评论


您也可以使用g(逗号)转到新的编辑位置。

–詹姆斯
2015年2月20日在23:12



#5 楼

由于在上一个命令撤消时Vi中的undo命令将作为重做,因此我使用uu作为回到我上次编辑的位置的一种方法。设置了nocompatible(就像大多数人一样)后,您要使用u,然后再使用CTRL+R撤消和重做。否则,uu将与Vi中的功能相同。

评论


如果不使用:set nocompatible,它将使用。

–muru
15年2月20日在9:47

我的vim(不兼容)对uu进行了两次撤消,但是我使用u和CTRL + r来达到相同的效果。

– Shahbaz
15年2月20日在11:04

如果您在Aix / HPUX / Solaris /其他Unix变体上没有vim,则此答案的优点是也可以与vi一起使用。

–贡特拉姆·布洛姆(Guntram Blohm)
15年2月21日在8:50

#6 楼

在接受的答案上保存字符: (输入起来也更快!)