在VIM插入模式下重复字符

时间:2011-02-19 23:10:21

标签: vim

在Vim的插入模式下有没有办法重复一个角色?例如,假设我想插入80个破折号,就像我输入的emacs:

Ctrl + U 8 0 -

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

Esc 8 0 a - Esc a

不要切换进出模式会很好。

13 个答案:

答案 0 :(得分:210)

如果您只能退出INSERT模式一次(最后),则此序列有效:

Ctrl + o 80i- Esc

  • Ctrl + o 用于在不离开INSERT模式的情况下发出正常命令,
  • 80重复,
  • i要插入,
  • -您要插入的字符,
  • Esc 退出INSERT模式。

另一个没有离开INSERT模式的人:

Ctrl + o :norm 8ia 返回

答案 1 :(得分:132)

Esc n i c < kbd> Esc Esc

E.g。 Esc 4 i J Esc Esc 将输出JJJJ

答案 2 :(得分:18)

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

答案 3 :(得分:17)

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>

答案 4 :(得分: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>

答案 5 :(得分:7)

你也可以这样做,      Esc n i 你好 Esc Esc

其中, n是重复次数。

如,      Esc 5i 你好 Esc Esc

答案 6 :(得分:6)

你说它会很好的&#39;留在&#39;插入&#39;模式,但在命令模式下,以下方法将避免您的第二个 ESC : -

虽然我知道这篇文章已经过时了但是错过了明显的剪切/复制和粘贴等问题似乎很遗憾。选项...

x ... cut

8 0 ...份数

p 粘贴

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

答案 7 :(得分:5)

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

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

也就是说:

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

可多次重复任何字符。

这比@romainl的答案使用了更多的击键,但根本没有离开插入模式。

答案 8 :(得分:4)

通过一次重复:

Insert mode
-
Esc
80.

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

答案 9 :(得分:3)

迟到的答案,但是对于它的价值,如果你想要发送垃圾邮件,你可以使用 &#34;重复上一个命令&#34;命令:.

i &#34; Phrase&#34; 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).

当我不确切地知道我想要做多少次重复时,我发现这特别有用,但我知道我想要多长时间。基本上爆炸.,直到我的眼睛满足。

答案 10 :(得分:2)

除了编写多次重复文本的功能外,您还可以使用&lt; C-x&gt;&lt; C-l&gt; :如果您已经有包含80个破折号的行,则写一个在新线的开始处几次短划线然后按&lt; C-x&gt;&lt; C-1&gt; 将完成以这几个短划线开始的线,这些线可能是具有80个短划线的线。我曾经以这种方式在帮助文件中写水平线(78个破折号)。

答案 11 :(得分:1)

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

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

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

通过使用函数repeat,您可以多次重复字符串。

请注意,您可以在更新.vimrc之前通过输入command模式然后发出以下:iab <expr> -- repeat('-', 80)

进行测试

答案 12 :(得分: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

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