Answers:
这是适合您给定场景的另一种方法,它将跳转到您紧接之前的位置gg(而不是最后更改的行)。
当您按时gg,您的旧光标位置将被推入跳转列表。来自:help jumplist:
跳转记忆在跳转列表中。使用
CTRL-O和CTRL-I命令,您可以在较早的跳转之前移至光标位置,然后再次返回。因此,您可以在列表中上下移动。每个窗口都有一个单独的跳转列表。条目的最大数量固定为100。[…]
如果使用跳转命令,则将当前行号插入到跳转列表的末尾。如果同一行已经在跳转列表中,则将其删除。结果是重复时
CTRL-O您只会回到原来的位置一次。
这要求您将Vim(而非vi)与该+jumplist功能一起使用。如果:echo has('jumplist')打印1,则可以使用它。
为了增加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'^做为动作。
由于在上一个命令撤消时,Vi中的撤消命令将充当重做操作,因此我已将其用作uu返回到上次编辑的位置的一种方法。
如果您正在运行nocompatibleset的Vim (就像大多数人一样),则要使用,u然后再使用CTRL+R撤消和重做。否则uu将与Vi一样工作。
:set nocompatible不使用它将。
vim(with nocompatible)对进行两次撤消uu,但我使用u和CTRL+r具有相同的效果。
g;和g,在更改列表中的位置之间移动。见:h g;和:h g,