Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从vim中的重做(点)中排除命令窗口更改?_Vim - Fatal编程技术网

如何从vim中的重做(点)中排除命令窗口更改?

如何从vim中的重做(点)中排除命令窗口更改?,vim,Vim,我总是使用命令窗口而不是命令提示符 我通过地图做这件事 nnoremap : q:i 问题是:对命令缓冲区所做的更改随后会出现在重做寄存器中 (我不确定这是否是正确的术语,请纠正我) 例如,每当我执行:w保存文件时,下一次发布的dot会插入一个w 当命令窗口关闭时,我是否可以忘记在命令窗口中生成的可重做命令?这是使用命令窗口的一个不幸的副作用:当您使用“真实”Vim命令编辑命令时,这些命令自然也会被存储以供重做。由于无法暂时暂停命令的录制,您必须忍受这种副作用,或者切换到对大多数Ex命令使用命

我总是使用命令窗口而不是命令提示符

我通过地图做这件事

nnoremap : q:i
问题是:对命令缓冲区所做的更改随后会出现在重做寄存器中 (我不确定这是否是正确的术语,请纠正我)

例如,每当我执行
:w
保存文件时,下一次发布的dot会插入一个
w


当命令窗口关闭时,我是否可以忘记在命令窗口中生成的可重做命令?

这是使用命令窗口的一个不幸的副作用:当您使用“真实”Vim命令编辑命令时,这些命令自然也会被存储以供重做。由于无法暂时暂停命令的录制,您必须忍受这种副作用,或者切换到对大多数Ex命令使用命令行。

我认为这可以通过使用CmdwinEnter和CmdwinLeave事件来完成(记住要重复的命令是什么)。”在命令窗口中输入,并在命令窗口中重置该值(左)

不幸的是,我找不到方法通过编程设置“最后一个要由“”重复的命令”的值


因此,据我所知,目前没有办法做到这一点。

我不确定是否有定义的名称,但“重复寄存器”或“重复缓冲区”非常接近。请参阅
:help repeat.txt
:help registers
。注意,通常命令行不包括在repeat寄存器中;这仅在进入命令行编辑窗口时发生。我不知道如何解决这个问题。我理解为什么这种行为是这样的,但我怀疑它是不能弯曲的。不是没有一个可笑的扭曲的实现(比如包装所有内置的Vim命令)或者没有对Vim的源代码进行修补。有趣!也许我们可以重新定义点?重点是:就我所知,没有程序访问最后一个正常模式命令(“将重复”的命令)所包含的信息。存在点寄存器(“.),它包含最后插入的文本,接近我们想要的内容。但它只包含文本,而不包含命令(您不知道它是“i”还是“a”)。而且,寄存器是只读的。因此,您必须实现一个基础结构来记住发出的每个命令,这对我来说似乎有些过分。因此,我认为没有办法做到这一点。但我很高兴知道是否有其他人知道得更好。