在VIM插入模式下重复字符


141

在Vim的插入模式下,是否可以重复一个字符?例如,假设我想在像emacs这样的内容中输入80个破折号:

Ctrl+U   8 0 -

我知道如何在VIM中执行此操作的唯一方法是退出正常模式的repeat参数,然后回到插入模式以键入破折号,然后退出以插入实际破折号,然后再回到插入模式进行打字。这个序列很长:

Esc 8 0 a - Esc a

最好不要进入和退出模式。

Answers:


20

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>

259

如果您可以只退出一次INSERT模式(最后一次),那么此序列有效:

Ctrl+o 80i- Esc

  • Ctrl+ o用于发出普通命令而不会退出INSERT模式,
  • 80 重复,
  • i 插入
  • - 您要插入的字符,
  • Esc 退出INSERT模式。

另一个从未退出INSERT模式的情况:

Ctrl+o :norm 8ia Return


6
您的答案和OP的答案是唯一对我有用的答案。
twblamer 2011年

34
“ <Co>用于发出普通命令而不会离开INSERT模式”赢得了我无法相信的我永远不会知道这个奖项!
稳定狗2014年

11
<C-o>Ctrl+的简写o
Shaun Luttin 2015年

3
还有一个:normal命令,可让您从命令提示符下发出它们。有时候挺有用的。
马克·里德

157

Escnic Esc Esc

例如Esc4iJEsc Esc将输出JJJJ


3
不幸的是,除非您转回正常模式,否则这对我的vim无效。
Cthutu 2011年

5
但这是“ vim方式”的最佳答案。
Drasill

1
当我按i时,我总是回到自己的插入模式,因此,我只会插入CHARACTER。我该如何工作?
Severo Raz

1
这是OP想要避免的确切命令顺序。
肯尼·埃维特

1
这可能不是所提出问题的答案,但是它是解决问题的一种方法,也是我所寻找问题的答案。
Michael Leonard

20
<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.

8
这是OP想要避免的确切命令顺序。
肯尼·埃维特

13

通过单次重复:

Insert mode
-
Esc
80.

有关单次重复的更多详细信息: :help .


谢谢,但是此解决方案要求您退出插入模式。
Cthutu

8

你也可以 Escnihello there EscEsc

其中,n是重复次数。

例如, Esc5ihello there EscEsc



这不是完全相同的副本。另一个人不适合我。在这里,我意识到Esc之后必须按两次。感谢@prashant
Sridhar Sarnobat

7

还有许多其他方法,但AFAIK是您描述的最短的一种。在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 2011年

6

您说停留在“插入”模式将是“不错的”,但是在命令模式下,以下方法将避免您的第二个ESC:-

虽然我知道这篇文章很旧,但是错过明显的“剪切/复制和粘贴”选项似乎很可惜...

x ...切

80 ...复印数量

p

注意:这类似于Martin Beckett建议的方法,但是发出该命令时会出现延迟,可能是因为它多次切换了模式,所以该命令会立即执行。


1
我必须先v y进入视觉模式,然后拉动,然后80 p粘贴80次。我错过了什么,还是忘记了一步?
alexanderbird

发现得很好,我应该使用'x'进行切割,然后粘贴。谢谢,我已经修改了答案。
Inyoka '16

1
很好,因为它实际上比典型的重复方法快。
辅助

3

答案较晚,但是有什么用,如果您想发送垃圾邮件,则可以使用“ repeat last command”命令: .

i“词组” Esc -i to insert, enter phrase/character, esc to go normal mode

. -- Spam till you are satisfied. Will repeatedly input the phrase you typed (it repeats your last command).

当我不知道确切要重复多少次,但在视觉上知道要重复多久时,我发现这特别有用。基本上,.直到我满意为止。


3

我很惊讶还没有人建议这样做:

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

那是:

  • Ctrl-r=
  • 在出现的提示下,输入 repeat('-', 80)
  • Enter

可重复任意次数任何字符。

这比@romainl的答案使用的击键次数更多,但根本不会离开插入模式。


2

除了编写可重复文本多次的功能外,您还可以使用<C-x><C-l>:如果您已经有包含80个破折号的行,则在新行的开头写入一些破折号,然后按<C-x><C-l>将完成以这些破折号开头的行,该行可能带有80个破折号。我曾经以这种方式在帮助文件中写水平线(78破折号)。


1

对于这样一个简单的任务,abbreviation应该可以解决。将以下内容添加到您的.vimrc

iab <expr> -- repeat('-', 80)

从现在开始,当您输入--后跟一个空格(处于插入模式时)时,--将会自动转换为-80次。

通过使用功能 repeat您可以根据需要多次重复字符串。

请注意,您可以在.vimrc进入command模式之前进行更新,然后发出以下命令进行测试:iab <expr> -- repeat('-', 80)


1

我执行此操作时没有使用以下步骤退出INSERT模式。

  1. 启用INSERT模式。
  2. 键入一个破折号“-”。
  3. Ctrl + O
  4. 小写字母“ v”(进入-- (insert) VISUAL --模式)
  5. 小写字母“ y”(要复制)
  6. Ctrl + O
  7. 80型
  8. 然后,后面跟小写字母“ p”(用于粘贴)。

i - Ctrl+o v y Ctrl+o 80 p

这将在一行中水平打印所有破折号。

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.