在Vim的插入模式下,有没有一种重复输入字符的方法?例如,我想要插入80个破折号,在类似Emacs的编辑器中,我会输入:
Ctrl+U 8 0 -
我所知道的唯一在Vim中实现的方式是退出正常模式以获取重复参数,然后再返回插入模式以输入破折号,接着再退出插入模式插入实际的破折号,最后再回到插入模式继续输入。这个序列非常冗长:
Esc 8 0 a - Esc a
不需要频繁切换模式会更好。
在Vim的插入模式下,有没有一种重复输入字符的方法?例如,我想要插入80个破折号,在类似Emacs的编辑器中,我会输入:
Ctrl+U 8 0 -
我所知道的唯一在Vim中实现的方式是退出正常模式以获取重复参数,然后再返回插入模式以输入破折号,接着再退出插入模式插入实际的破折号,最后再回到插入模式继续输入。这个序列非常冗长:
Esc 8 0 a - Esc a
不需要频繁切换模式会更好。
如果您只需要在最后一次离开插入模式,那么这个序列可以使用:
Ctrl+o 80i-
Esc
80
表示重复次数,i
表示插入,-
表示要插入的字符,另一个方法是完全不离开插入模式:
Ctrl+o :norm 8ia
Return
Esc nic Esc .
E.g. Esc 4iJ Esc will output JJJJ
.
<ESC>80i-<ESC>
。 - KFL通过单次重复:
它将输出:81 -
,就像这样:
---------------------------------------------------------------------------------
单个重复的更多细节::help .
vim
语言... 这就是为什么它是最好的答案。 - 71GAEelvex的解决方案稍有不同:
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>
<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.
Esc
。谢谢 @prashant - Sridhar Sarnobat我很惊讶没有人提出这个建议:
在插入模式下,使用<C-r>=repeat('-', 80)<CR>
即:
repeat('-', 80)
适用于重复任何字符任意次数。
这比@romainl的答案更多的按键,但根本不会离开插入模式。
除此之外,还有许多其他的方法,但据我所知,你描述的那个是最短的一个。在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>
您说保持“插入模式”会很好,但在命令模式下,以下方法可以避免第二个ESC键:
虽然我知道这篇帖子有点旧了,但错过了显而易见的“剪切/复制和粘贴”选项太可惜了...
x ...剪切
80 ...副本数量
p 粘贴
注意:这类似于Martin Beckett建议的方法,但当发出该命令时我会有一些延迟,可能是因为它多次切换模式,而此命令立即执行。
v
y
进入可视模式,然后复制,再使用 80
p
粘贴80次。我有什么遗漏的步骤吗?还是你忘记了一步? - alexanderbird.
i "短语" Esc - i: 插入,输入短语/字符,esc: 返回正常模式
. - 不停地发送,直到满意为止。会重复输入您键入的短语(重复您的最后一条命令)。
当我不知道要重复多少次时,但又知道视觉上想要多长时,我发现这特别有用。基本上一直按.
,直到我满意为止。
<C-o>
是Ctrl
+o
的速记方式。 - Shaun Luttin:normal
命令,它允许你从命令提示符下发出它们。有时相当有用。 - Mark Reed