Ответ 1
Немного другая версия решения 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>
Есть ли способ повторить символ в режиме вставки Vim? Например, скажем, я хотел бы вставить 80 тире, во что-то вроде emacs, я бы набрал:
Ctrl + U 8 0 -
Единственный способ, которым я знаю, как это сделать в VIM, - выйти из нормального режима для аргумента repeat, затем вернуться в режим вставки, чтобы ввести тире, затем выйти, чтобы вставить фактические тире, а затем вернуться в режим вставки продолжать печатать. Последовательность очень длинная:
Esc 8 0 a - Esc a
Было бы неплохо не включать и выключать режимы.
Немного другая версия решения 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>
Если вы в порядке, оставив режим INSERT только один раз (в конце), эта последовательность работает:
<C-o>80i-<Esc>
<C-o>
используется для выдачи нормальных команд, не выходя из режима INSERT,80
повторение,i
для вставки,-
символ, который вы хотите вставить,<Esc>
, чтобы выйти из режима INSERT.Другой, не обратившись в режим INSERT:
<C-o>:norm 8ia<CR>
Esc n i c Esc Esc.
например. Esc 4 i J Esc Esc выводит JJJJ
.
<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.
Есть много других способов, но 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>
Вы также можете сделать, <Б > Esc ni hello there Esc Esc
где, n - количество повторов.
например., Esc 5i hello there Esc Esc
Вы сказали, что было бы "приятно" оставаться в режиме "Вставить", однако в командном режиме следующий метод избежал бы вашего второго ESC: -
Пока я знаю, что эта почта старая, кажется, стыдно пропустить очевидную опцию "Вырезать/Копировать и Вставить"...
x... cut
8 0... количество копий
p Вставить
Примечание. Это похоже на метод, предложенный Мартином Беккетом, однако я получаю задержку при выдаче этой команды, возможно, потому, что он несколько раз переключает режимы, эта команда выполняется мгновенно.
Поздний ответ, но за то, что он стоит, если вы хотите, чтобы его рассылали спам, вы можете использовать
Команда "повторить последнюю команду": .
i "Фраза" 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).
Я нахожу это особенно полезным, когда я не знаю точно, сколько повторений я хочу сделать, но знаю визуально, как долго я хочу, чтобы это было. В основном взрывайте .
, пока мои глаза не будут довольны.
В дополнение к функции записи, которая будет повторяться несколько раз, вы можете использовать <C-x><C-l>: если у вас уже есть строка, содержащая 80 тире, запись нескольких тире в начале новой строки, а затем нажатие <C-x><C-l> завершается линии, которые начинаются с этих нескольких тире, которые, вероятно, будут иметь линию с 80 тире. Я использовал для записи горизонтальных линий (78 тире) в файлах справки таким образом.