在 VIM 插入模式中重复字符

在 Vim 的插入模式下,是否有重复字符的方法?例如,假设我想在类似 emacs 的东西中插入80个破折号,我会输入:

Ctrl + U 8 0 -

我知道在 VIM 中如何做的唯一方法是退出重复参数的正常模式,然后回到插入模式键入破折号,然后退出插入实际的破折号,然后回到插入模式继续键入。这个序列真的很长:

Esc 8 0 a - Esc a

最好不要切换进出模式。

87361 次浏览

Escnic Esc Esc.

例如,Esc4iJEsc将输出 JJJJ

有许多其他的方法,但 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>

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>

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

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

如果您可以只离开 INSERT 模式一次(在最后) ,这个顺序可以工作:

Ctrl + o

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

另一个没有离开插入模式的:

Ctrl + o

你也可以, Escnihello there EscEsc

在哪里, N 是重复次数。

例如: Esc5ihello there EscEsc

回答晚了,但是无论如何,如果你想发送垃圾邮件,你可以使用 “重复上次命令”命令: .

短语 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).

我发现当我不确切地知道我想要做多少次重复,但是直观地知道我想要它多长时间的时候,这个方法特别有用。基本上就是把 .开到我满意为止。

你说这将是’好’留在’插入’模式,但在命令模式下的方法将避免你的第二个 ESC:-

虽然我知道这篇文章已经过时了,但是错过明显的“剪切/复制和粘贴”选项似乎是一种耻辱..。

x

80... 拷贝数

p粘贴剂

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

对于这样一个简单的任务 abbreviation应该做的诀窍。添加以下到您的 .vimrc

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

从现在起,当您键入 --后跟一个空格(当您在插入模式) ,--将自动转换为 -80次。

通过使用函数 repeat,您可以随心所欲地重复字符串。

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

通过单次重复:

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

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

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

更多关于单次重复的信息: :help .

我使用下面的步骤在不退出 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

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

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

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

那就是:

  • Ctrl-r=
  • 在结果提示符下,输入 repeat('-', 80)
  • Enter

可以多次重复任何字符。

这比@romainl 的答案使用了更多的击键,但是根本不离开 Insert 模式。