如何跳转到上次编辑的位置?


68

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

Answers:


84

`.命令将带您进行最后更改。

`去一个标志,.是一个“特殊”的标志,它会自动设置为在上次改变的位置。请参阅参考资料:help `.

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

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

请参阅:help mark-motions有关使用标记的更多常规信息(包括一些其他自动设置的“特殊”标记)。


7
您还可以使用g;g,在更改列表中的位置之间移动。见:h g;:h g,
彼得Rincker

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

21

这是适合您给定场景的另一种方法,它将跳转到您紧接之前的位置gg(而不是最后更改的行)。

采用 CtrlO

当您按时gg,您的旧光标位置将被推入跳转列表。来自:help jumplist

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

[…]

如果使用跳转命令,则将当前行号插入到跳转列表的末尾。如果同一行已经在跳转列表中,则将其删除。结果是重复时CTRL-O您只会回到原来的位置一次。

这要求您将Vim(而非vi)与该+jumplist功能一起使用。如果:echo has('jumplist')打印1,则可以使用它。


19

为了增加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;移至上一个更改位置,然后g,移至下一个更改位置。您还可以在列表中键入更改之前g;g,转到更改的编号。上面,2g;将我带到涉及stdio.h的更改发生的位置。

在堆栈中间时,来自:changes更新的数字将显示相对距离。例如:

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

这表明我可以后退一个(1g;或仅g;)或前进一个(1g,或仅g,)。

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

这样做的缺点是它看起来不像正常运动。例如,您不能做dg;从光标删除到上一个更改位置的操作,而d'.d'^做为动作。


15

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


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

5

由于在上一个命令撤消时,Vi中的撤消命令将充当重做操作,因此我已将其用作uu返回到上次编辑的位置的一种方法。

如果您正在运行nocompatibleset的Vim (就像大多数人一样),则要使用,u然后再使用CTRL+R撤消和重做。否则uu将与Vi一样工作。


如果:set nocompatible不使用它将。
muru 2015年

2
我的vim(with nocompatible)对进行两次撤消uu,但我使用uCTRL+r具有相同的效果。
Shahbaz 2015年

如果您在Aix / HPUX / Solaris /其他Unix变体上没有vim,则此答案的优点是它也可以与vi一起使用。
Guntram Blohm 2015年
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.