在VIM插入模式下重复字符

175

在Vim的插入模式下,有没有一种重复输入字符的方法?例如,我想要插入80个破折号,在类似Emacs的编辑器中,我会输入:

Ctrl+U   8 0 -

我所知道的唯一在Vim中实现的方式是退出正常模式以获取重复参数,然后再返回插入模式以输入破折号,接着再退出插入模式插入实际的破折号,最后再回到插入模式继续输入。这个序列非常冗长:

Esc 8 0 a - Esc a

不需要频繁切换模式会更好。

13个回答

314

如果您只需要在最后一次离开插入模式,那么这个序列可以使用:

Ctrl+o 80i- Esc

  • Ctrl+o 用于在不离开插入模式的情况下发出普通命令,
  • 80 表示重复次数,
  • i 表示插入,
  • - 表示要插入的字符,
  • Esc 用于退出插入模式。

另一个方法是完全不离开插入模式:

Ctrl+o :norm 8ia Return


6
你的答案和原帖作者的答案是唯一对我有效的。 - twblamer
47
"<C-o>"可以在不离开INSERT模式的情况下执行普通命令,这个技巧使我惊叹不已,我以前居然不知道! - Stabledog
11
<C-o>Ctrl + o 的速记方式。 - Shaun Luttin
3
还有:normal命令,它允许你从命令提示符下发出它们。有时相当有用。 - Mark Reed

195

Esc nic Esc .

E.g. Esc 4iJ Esc will output JJJJ.


3
抱歉,除非您返回到正常模式,否则这在我的vim上不起作用。 - Cthutu
11
但这是“Vim方式”中最好的答案。 - Drasill
2
我总是发现当我按下i键时,自己会回到插入模式,因此我只能插入字符。我该怎么解决这个问题? - Severo Raz
2
这可能不是被问到的问题的答案,但这是vim的方式来做,并且它是我正在寻找的答案。 - Michael Leonard
5
对我来说,只需要在结尾加一个ESC就足够了。我会插入80个“-”来形成分割线。因此我的操作是:<ESC>80i-<ESC> - KFL
显示剩余5条评论

45

通过单次重复:

  1. 按下:i 进入插入模式
  2. 按下:-
  3. 按下:Esc
  4. 按下:80.

它将输出:81 -,就像这样:

---------------------------------------------------------------------------------

单个重复的更多细节::help .


谢谢,但是这个解决方案需要你退出插入模式。 - Cthutu
1
这确实是vim语言... 这就是为什么它是最好的答案。 - 71GA
1
那是我的赢家。此外,您可以重复使用“。+ ENTER”来添加更多的重复。 - Hari Honor
我喜欢这个,但你最终会有81个字符。 - Irgendwoanders
对我来说这有点令人困惑。我在vscode中使用VIM,必须按80,然后是'i','-'和esc,最后才能像你在这个答案中所说的那样重复。然后我得到了80而不是81个字符。 - Erlandsen-tech
好的,我已经将80改成了81 :) - itsnikolay

24

Eelvex的解决方案稍有不同:

function! Repeat()
    let times = input("Count: ")
    let char  = input("Char: ")
    exe ":normal a" . repeat(char, times)
endfunction

imap <C-u> <C-o>:call Repeat()<cr>

24
<ESC> 
<the number of times you want to repeat>
i 
<the char you want to repeat> 
<ESC>

for example: <ESC>12ia<ESC> will insert 12 a's.

10
这是原帖作者想要避免的确切指令序列。 - Kenny Evitt

13
你还可以这样做, Escni你好啊EscEsc 其中,n是重复的次数。
例如, Esc5i你好啊EscEsc

这看起来像是Martin Beckett的回答的完全重复。 - mkobit
这不是完全的重复。另一个对我没用。在这里我意识到我之后必须按两次 Esc。谢谢 @prashant - Sridhar Sarnobat

13

我很惊讶没有人提出这个建议:

在插入模式下,使用<C-r>=repeat('-', 80)<CR>

即:

  • Ctrl-r=
  • 在弹出的提示符中,输入 repeat('-', 80)
  • 按下回车键

适用于重复任何字符任意次数。

这比@romainl的答案更多的按键,但根本不会离开插入模式。


我不仅不能相信这么晚还没有人提出这个建议,而且你的解决方案得到的赞数如此之少。我一直在寻找/希望有像这样(使用Ctrl-r)的东西存在,我几乎关闭了这个标签页,但很幸运我找到了这个。太棒了,谢谢你 :) - Pixelbog

8

除此之外,还有许多其他的方法,但据我所知,你描述的那个是最短的一个。在vim中,你大部分时间都应该待在命令模式下,这只需要3个按键加上重复的次数(80i-)。

然而,如果你发现自己经常使用这个重复功能,可以创建一个函数或宏来实现;也许可以像这样:

:function Repeat(char)
: let counter = input("How many times?: ")
: call feedkeys("i")
: call feedkeys(repeat(a:char,counter))
:endfunction
:imap <C-U> <ESC>h"ryl :call Repeat(@r)<CR>

对我来说没有用,但还是谢谢你的回答。我的vim编程语言知识不足以弄清楚为什么。 - Cthutu

7

您说保持“插入模式”会很好,但在命令模式下,以下方法可以避免第二个ESC键:

虽然我知道这篇帖子有点旧了,但错过了显而易见的“剪切/复制和粘贴”选项太可惜了...

x ...剪切

80 ...副本数量

p 粘贴

注意:这类似于Martin Beckett建议的方法,但当发出该命令时我会有一些延迟,可能是因为它多次切换模式,而此命令立即执行。


1
我必须使用 v y 进入可视模式,然后复制,再使用 80 p 粘贴80次。我有什么遗漏的步骤吗?还是你忘记了一步? - alexanderbird
非常好,我应该使用“x”来剪切,然后粘贴。谢谢,我已经修改了我的答案。 - Inyoka
1
很好,因为这实际上比典型的重复方法更快。 - Auxiliary

3
晚了点回答,但如果你想要手动发送垃圾邮件,可以使用“重复上一条命令”的命令:. i "短语" Esc - i: 插入,输入短语/字符,esc: 返回正常模式 . - 不停地发送,直到满意为止。会重复输入您键入的短语(重复您的最后一条命令)。 当我不知道要重复多少次时,但又知道视觉上想要多长时,我发现这特别有用。基本上一直按.,直到我满意为止。

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