在Vim的插入模式下有没有办法重复一个角色?例如,假设我想插入80个破折号,就像emacs一样,我会输入:
Ctrl+U 8 0 -
我知道如何在VIM中执行此操作的唯一方法是退出正常模式以获取repeat参数,然后返回插入模式以键入破折号,然后退出以插入实际破折号,然后返回插入模式以继续打字.序列非常长:
Esc 8 0 a - Esc a
不切换进出模式会很好.
rom*_*inl 225
如果你只能离开INSERT模式一次(最后),这个序列有效:
Ctrl+o 80i-
Esc
80
重复, i
插入,-
要插入的字符,另一个没有离开INSERT模式的人:
Ctrl+o :norm 8ia
Return
Mar*_*ett 141
Escnic Esc Esc.
例如Esc4iJEsc Esc将输出JJJJ
.
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)
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)
还有很多其他方法,但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)
你说保持'插入'模式会很"好",但是在命令模式下,以下方法可以避免你的第二个ESC: -
虽然我知道这篇文章很老,但是错过明显的"剪切/复制和粘贴"选项似乎很遗憾......
x ...切
80 ...复印数量
p 糊
注意:这类似于Martin Beckett建议的方法,但是在发出该命令时会出现延迟,可能是因为它多次切换模式,此命令会立即执行.
我很惊讶还没有人提出这个建议:
在插入模式下,使用 <C-r>=repeat('-', 80)<CR>
那是:
repeat('-', 80)
适用于多次重复任何字符。
This uses more keystrokes than @romainl's answer, but does not leave Insert mode at all.