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
返回到上次编辑的位置的一种方法。
如果您正在运行nocompatible
set的Vim (就像大多数人一样),则要使用,u
然后再使用CTRL+R
撤消和重做。否则uu
将与Vi一样工作。
:set nocompatible
不使用它将。
vim
(with nocompatible
)对进行两次撤消uu
,但我使用u
和CTRL+r
具有相同的效果。
g;
和g,
在更改列表中的位置之间移动。见:h g;
和:h g,