在VIM插入模式下重复字符

Cth*_*utu 124 vim

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

Ctrl+U   8 0 -

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

Esc 8 0 a - Esc a

不切换进出模式会很好.

rom*_*inl 225

如果你只能离开INSERT模式一次(最后),这个序列有效:

Ctrl+o 80i- Esc

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

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

Ctrl+o :norm 8ia Return

  • "<Co>用于在不离开INSERT模式的情况下发出正常命令"赢得了我的不相信 - 我永远不知道这个奖项! (29认同)
  • `<Co>`是`Ctrl` +`o`的简写. (10认同)
  • 你的答案和OP的答案是唯一对我有用的答案. (5认同)
  • 还有`:normal` 命令可以让你从命令提示符发出它们。偶尔相当有用。 (3认同)

Mar*_*ett 141

Escnic Esc Esc.

例如Esc4iJEsc Esc将输出JJJJ.

  • 最后它缺少一个ESC才能工作 (7认同)
  • 对我来说最后只需一个ESC就足够了。我插入 80 个 `-` 来形成分割线。所以我这样做:`&lt;ESC&gt;80i-&lt;ESC&gt;` (5认同)
  • 不幸的是,除非你逃回正常模式,否则这对我的vim不起作用. (3认同)
  • 但这是"vim方式"中的最佳答案. (3认同)
  • 当我按 i 时,我总是发现自己回到插入模式,所以我只会插入字符。我该如何操作这个? (2认同)
  • 这可能不是所问问题的答案,但它是执行此操作的 vim 方式,并且是我正在寻找的问题的答案。 (2认同)

qed*_*qed 19

<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.
Run Code Online (Sandbox Code Playgroud)

  • 这是OP想要避免*的命令的确切顺序. (7认同)

Mat*_*iva 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>
Run Code Online (Sandbox Code Playgroud)


its*_*lay 9

通过单次重复:

Insert mode
-
Esc
80.
Run Code Online (Sandbox Code Playgroud)

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


Eel*_*vex 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>
Run Code Online (Sandbox Code Playgroud)


pra*_*ant 7

你也可以这样做, Escnihello there EscEsc

其中,n是重复次数.

例如, Esc5ihello there EscEsc


Iny*_*oka 6

你说保持'插入'模式会很"好",但是在命令模式下,以下方法可以避免你的第二个ESC: -

虽然我知道这篇文章很老,但是错过明显的"剪切/复制和粘贴"选项似乎很遗憾......

x ...切

80 ...复印数量

p

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


Gre*_*ers 6

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

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

那是:

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

适用于多次重复任何字符。

This uses more keystrokes than @romainl's answer, but does not leave Insert mode at all.