如何在 Vim 中重复任何命令,例如 emacs 中的“C-x z”?

Posted

技术标签:

【中文标题】如何在 Vim 中重复任何命令,例如 emacs 中的“C-x z”?【英文标题】:How do I repeat any command in Vim, like "C-x z" in emacs? 【发布时间】:2011-06-14 23:00:44 【问题描述】:

在 Vim 中,有没有什么方法可以重复上一条命令,不管它是否是编辑,并且没有先见之明先录制宏?

例如假设我输入:bn,并想再做一次(这是错误的文件)。按. 显然不行。或者也许我正在做gE 并想重复一遍(只需按一下键,因为显然gE 打字有点痛苦)。

也许有一些插件?类似于this question。

(更酷的方法是将许多命令追溯绑定到一个宏,因此可以键入 5qa@a 或其他内容来重复最后 5 个命令...)

【问题讨论】:

【参考方案1】:

要重复命令行命令,请尝试@:,要重复普通/插入模式命令,请尝试.

如果您想使用相同的快捷方式,请将以下映射添加到您的 .vimrc:-

:noremap <C-P> @:<CR> - 这会将 Ctrl+P 映射到上一个命令行命令。您可以映射任何其他组合。

【讨论】:

那么像“gE”这样的普通模式命令呢?有一个 ":norm" 命令用于从命令行执行普通模式命令,但它不会重复... gE 到底做了什么?我尝试dw 删除一个单词,然后我按下. 删除另一个单词 是一个动作命令,“倒退到WORD的末尾”,E的倒过来。 ctr+P 用于自动完成代码,所以你可能不会重新映射到那个 Ctrl+P 也映射到了所谓的插件CtrlP【参考方案2】:

:help repeating 将提供典型的重复命令(如 .、@: 等)。你可以试试repeat.vim。这可能会让您更接近您正在寻找的东西。

【讨论】:

【参考方案3】:

对于运动命令,Vim 没有内置机制。 Find 和 To 命令 (f/F/t/T) 有 ;, 重复和反转。有几个插件可以扩展这些绑定以重复其他运动命令:

http://www.vim.org/scripts/script.php?script_id=2174

http://www.vim.org/scripts/script.php?script_id=3665

后者应该支持使用;重复gE

【讨论】:

【参考方案4】:

你可以只使用“。”

示例: 您的文件中有 10 个位置有“abc”,并且您想在其中的 5 个位置用“def”替换它。

第 1 步:通过键入命令“/abc”查找 abc 的第一次出现 第2步:一旦光标在“abc”上,用命令“cw”替换abc以取出单词“abc” 第 3 步:输入“def”作为替换,然后按 Enter 进入命令模式 第 4 步:要重复此操作,只需键入命令“n”即可转到下一个出现的 abc 并键入命令“.”该命令会记住您上次将“abc”替换为“def”,并将在此处执行相同操作。

【讨论】:

【参考方案5】:

您可以将@: 映射到某个键以更方便:

:map <F2> @:

然后重复使用它会更容易。

【讨论】:

以上是关于如何在 Vim 中重复任何命令,例如 emacs 中的“C-x z”?的主要内容,如果未能解决你的问题,请参考以下文章

史上最全的Vim命令

Vim 的 dd,o,O 的 Emacs 等价物

通过 Emacs 中的 shell 命令过滤文本

如何在Vim上重复某些动作?

emacs 相当于 vim 的 shift-h 和 shift-l

Emacs 重复字符串 n 次