如何在Vim上重复执行某些操作多次?

31

Vim中,我通常想要重复一些命令。比如说,我想要注释5行代码,我会使用:

I//<Esc>j
.j.j.j.j

有没有办法多次重复最后的“ .j ”部分?


2
你的意思是像 5j 这样的东西吗? - C. Ross
这是对你需求的一个绕路回答,如果不是直接的问题。你似乎在这里注释了5行代码。如果这是你唯一的要求,那么你应该使用NERD Commenter插件。这个插件允许你输入5\cc,它会注释当前行和接下来的4行代码。5\cs也会做同样的事情,但是它不会添加//行注释,而是添加/**/来块注释你的代码行。更加灵活多变。 - cartbeforehorse
7个回答

46

一种方法是将你的键序列分配给一个宏,然后运行宏一次,接着运行@@ run-last-macro命令。例如:

qa.jq@a@@

如果您知道要重复宏的次数,可以使用4@@或其他任意数字。


4
8岁孩童的答案仍然可行,这证明了Vim编辑器的强大功能。 - Isaac Pak

16

你可以通过视觉选择要重复的行,在命令模式下键入:normal! .使vim在每行上使用.。由于你开始进行了视觉选择,最终看起来会像这样:

:'<,'>normal! .

然而,如果您经常添加和删除 // 注释,您可能会发现以下映射很有用:

" add // comment with K
noremap K :s,^\(//\)\=,//,e <BAR> nohls<CR>j
" remove // comment with CTRL+K
noremap <C-K> :s,^//,,e <BAR> nohls<CR>j
你可以使用5K来注释5行代码,你可以使用视觉模式先选择你要注释的行,或者你可以一直按K,直到你注释完你想要注释的所有内容。

12

关于您提供的具体示例,我倾向于使用可视块模式(使用Ctrl-v访问)进行多行插入。例如,如果我有以下行:

This should be a comment.
So should this.
This is definitely a comment.
Is this a comment? Yes.

我会先跳转到顶部行的第一个字符位置,按下Ctrl-v进入可视块模式,在导航到最后一行(可以使用3j向下移动三行,也可以使用4g直接跳转到第四行,或者简单地使用G跳转到结尾),然后键入I// <esc>以一次性在所有行上插入注释:

// This should be a comment.
// So should this.
// This is definitely a comment.
// Is this a comment? Yes.

另外,有一个非常方便的评论/取消评论插件支持多种语言 在这里。它比手动插入/删除评论更容易。


我使用这个:http://vim.sourceforge.net/scripts/script.php?script_id=1173非常不错。 - ThePosey
嗯,这个 Ctrl-V 方法对我不起作用... 只在第一行插入。也许是因为我还在使用 vim 7.2... - weronika
1
不,只是普通的vim...实际上我认为之前它不能工作是因为我用Ctrl-C退出而不是Esc,并且没有意识到它们是不同的。现在它可以工作了。(虽然我仍然不知道为什么它可以与I/A/s一起工作,但不能与i/a一起工作...) - weronika

6

尝试这个:

  1. 进行某些操作

  2. 退出到正常模式

  3. 输入,例如,22.

上述命令将重复22次。


3

针对您的特定示例,您还可以使用范围.,.5s#^#//#(执行此操作和接下来的5行)或视觉块(按v,然后选择要更改的文本),然后输入:%s#^#//#


你也可以使用":s#^#//# 5"(行数在末尾)。 - Neil

3

另一种方法是设置标记并在该范围内运行替换:

ma
jjjj
mb
:'a,'bs,^,// ,

2

您可以在宏前附加计数来重复执行宏。例如,如果您将宏记录到a寄存器中,并且您想要执行五次,则应键入以下内容:

5@a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接