将最后一个动作(。)保存在宏中


9

用例

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

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

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

到目前为止,我尝试过的是:

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


我正在努力理解您想做什么以及为什么不对宏做任何事情。

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

Answers:


2

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

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

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

现在,您已经在ex模式下拥有了普通模式命令,您还可以使用来浏览历史记录等命令q:,然后使用来将其复制到寄存器中"ay$,同时在包含要保存到宏的命令行的行中。然后,当您要运行宏时,可以使用@a


但是,您如何在命令行中编写普通模式命令?例如d2w
Peeyush Kushwaha '18年

在答案中添加了一些说明。是否有帮助?
alpha_989 '18

0

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

:let @a = @:

您可以使用再次执行它

@a

在vim 7.4中,这对我不起作用。似乎该寄存器:包含上次执行的命令,:command-name-goes-here而不是普通模式命令,例如d2w
Peeyush Kushwaha,

2
该解决方案仅适用于ex命令,不适用于普通模式命令。我不知道保存最后一个普通模式命令的寄存器。会有用
史蒂夫(Steve)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.