在 Vim 的插入模式下,是否有重复字符的方法?例如,假设我想在类似 emacs 的东西中插入80个破折号,我会输入:
Ctrl + U 8 0 -
我知道在 VIM 中如何做的唯一方法是退出重复参数的正常模式,然后回到插入模式键入破折号,然后退出插入实际的破折号,然后回到插入模式继续键入。这个序列真的很长:
Esc 8 0 a - Esc a
最好不要切换进出模式。
Escnic Esc Esc.
例如,Esc4iJEsc将输出 JJJJ。
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
i
另一个没有离开插入模式的:
你也可以, Escnihello there EscEsc
在哪里, N 是重复次数。
例如: Esc5ihello there EscEsc
回答晚了,但是无论如何,如果你想发送垃圾邮件,你可以使用 “重复上次命令”命令: .
.
短语 Esc-i to insert, enter phrase/character, esc to go normal mode
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).
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
abbreviation
.vimrc
iab <expr> -- repeat('-', 80)
从现在起,当您键入 --后跟一个空格(当您在插入模式) ,--将自动转换为 -80次。
--
-
通过使用函数 repeat,您可以随心所欲地重复字符串。
repeat
请注意,您可以在更新 .vimrc之前进行测试,方法是先进入 command模式,然后发出以下 :iab <expr> -- repeat('-', 80)
command
:iab <expr> -- repeat('-', 80)
通过单次重复:
它将输出: 81 -,像这样:
---------------------------------------------------------------------------------
更多关于单次重复的信息: :help .
:help .
我使用下面的步骤在不退出 INSERT 模式的情况下做到了这一点。
-- (insert) VISUAL --
i - Ctrl+o v y Ctrl+o 80 p
Ctrl+o
v
y
80
p
这将在一行中水平打印所有破折号。
我很惊讶还没有人提出这个建议:
在插入模式下,使用 <C-r>=repeat('-', 80)<CR>
<C-r>=repeat('-', 80)<CR>
那就是:
repeat('-', 80)
可以多次重复任何字符。
这比@romainl 的答案使用了更多的击键,但是根本不离开 Insert 模式。