用例

我处于正常模式。我没有明确考虑录制宏,但是我做了一个命令更改。现在,我可以通过使用点来重复此操作。

我现在意识到,将其保存在宏中以便以后使用,而不是每次都键入整个命令是一个有用的操作。我现在可以通过使用点来进行所有需要此命令的更改,或者可以继续编辑并稍后通过将其保存在宏中来使用此命令。

这就是我想要的这样做,但是我想到的最简单的方法并不容易-撤消更改,开始记录宏并重新键入命令以进行所需的更改,然后停止记录宏。

到目前为止,我尝试过什么:

在宏中记录点不起作用,因为它记录点而不是点执行的更改。 (例如,假设存储在dot中的命令是d5w。如果您开始记录宏并通过进行操作,希望每次运行该宏都会删除5个字,那么这种情况就不会发生。下次运行宏将执行点操作,而不执行命令d5w;这意味着,如果您在录制宏后进行了其他更改-说使用d3w删除3个单词,这是您执行的最后一次更改,则在运行宏时将删除3个单词而不是5个单词,因为它只是运行.

评论

我正在努力理解您想要做什么以及为什么您不使用宏执行任何操作。

@DrEval在执行正常模式命令后,OP意识到他们应该将其保存在宏中,并且不想在记录宏时再次键入它。

#1 楼

Vim不会保留您的普通模式命令的历史记录。如果您希望保留正常模式历史记录的历史记录,则可以使用以下内容将其保存到文件中:https://vi.stackexchange.com/a/587/13848

Normal模式命令通常很短,因此人们只需在正常模式下将其键入,而不尝试创建宏。但是,如果您确实想从普通模式命令中创建宏,则可以将其转换为Ex模式命令,然后将其保存到@wmmso指出的宏中。您可以使用norm命令来执行此操作。因此,如果要删除从当前光标位置开始的2个单词,并在Ex模式下使用普通模式命令,请使用:norm d2w。 (请参阅:http://vimdoc.sourceforge.net/htmldoc/various.html#:norm,在范围内执行常规命令)

如果是复杂的命令,最好使用Ex模式命令,因为它允许您在缓冲区中键入完整的命令,因此请确保其实际正确,并将其保存在命令行历史记录中。

现在,您在ex模式下具有普通模式命令,您还可以使用q:浏览命令(例如历史记录),然后使用"ay$将其复制到寄存器中,而在包含命令行的行中想要保存到宏。然后,当您要运行宏时,可以使用@a
执行该宏

评论


但是,如何在命令行中编写普通模式命令?例如d2w?

– Peeyush Kushwaha
18年7月1日在18:28

在回答中添加了一些说明。是否有帮助?

–alpha_989
18年7月1日在22:13

#2 楼

将“:”寄存器的内容(您刚才所做的)复制到另一个寄存器中,例如,注册a:

:let @a = @:


您可以使用

@a


评论


在vim 7.4中,这对我不起作用。似乎寄存器:包含通过:command-name-goes-here而不是诸如d2w之类的正常模式命令而最后执行的命令

– Peeyush Kushwaha
18年4月16日在10:00

该解决方案仅适用于ex命令,不适用于普通模式命令。我不知道保存最后一个普通模式命令的寄存器。会有用的

–史蒂夫
18年5月1日下午5:16