Vim 如何确定InsertLeave是否是更改的结果

Vim 如何确定InsertLeave是否是更改的结果,vim,Vim,在Vim中,基本上有两种类型的命令可以使其进入插入模式: 仅添加内容的命令,例如:i、i、a、a(除了使用退格)。 或者,也可以删除一段文本,例如:c[motions],c,s,v[motions]s 我想钩住InsertLeave事件,但在我的代码中,我需要知道它是哪种类型的更改(像I这样的插入,或者像cw这样的更改)。有什么办法可以找到答案吗?您可以利用其中的一个区别:change命令都会修改寄存器(除非黑洞寄存器是通过前缀“明确指定的),而插入则不会(好吧,除了”) 如果您在之前(例如使用

在Vim中,基本上有两种类型的命令可以使其进入插入模式:

仅添加内容的命令,例如:
i
i
a
a
(除了使用退格)。 或者,也可以删除一段文本,例如:
c[motions]
c
s
v[motions]s


我想钩住
InsertLeave
事件,但在我的代码中,我需要知道它是哪种类型的更改(像
I
这样的插入,或者像
cw
这样的更改)。有什么办法可以找到答案吗?

您可以利用其中的一个区别:change命令都会修改寄存器(除非黑洞寄存器是通过前缀
明确指定的),而插入则不会(好吧,除了


如果您在之前(例如使用
CursorMoved、CursorHold
组合)对默认寄存器进行“快照”,并比较
InsertLeave
上的内容,您可以发现。

ibar是否算作插入或更改?如果是后者,您可以
:撤消
InsertLeave
上的更改,存储受其影响的行(即
'[,']
),
:重做
,然后比较两个集。如果有“更多的文本”,那就是插入,否则就是改变。

我相信无论用户是否进入插入模式,
InsertEnter
就是这样。我不知道有什么方法可以确切地知道如何…嗯,这似乎是可能的。到目前为止,我想到的最好的是
au!InsertEnter*让b:lastwaschange=getpos(“.”)=getpos(“.”
,它查看最后一次更改的位置是否等于当前位置,但不幸的是,它不适用于
I
(也不适用于
o
o
)。您试图实现什么?也许有一种不同的方法,我想做的是查看原始文本是否匹配某个正则表达式,如果匹配,则将更改传播到整个缓冲区。它有点类似于
changeglobal
插件,但我希望它是自动的。我是changeglobal:-)的作者。我选择了不同的命令(
gc
)来明确行为(并且更容易实现),但您的用例可能不同。您希望在何处进行此自动全局替换?你有一个例子吗?是的,我也在想这个。唯一的问题是,如果编辑相同的文本(例如,如果您对一个单词执行类似于
ciwfouciwbar
的操作),寄存器可能会保持不变。我认为清空寄存器并尝试修复它不是一个好主意。:)这是个好主意!您是否有过使用
undotree()
(不必实际撤消内容)的经验/您认为可以这样做吗?我认为您无法从
undotree()
获得实际内容。