Повторение символов в режиме вставки VIM

Есть ли способ повторить символ в режиме вставки Vim? Например, скажем, я хотел бы вставить 80 тире, во что-то вроде emacs, я бы набрал:

Ctrl + U 8 0 -

Единственный способ, которым я знаю, как это сделать в VIM, - выйти из нормального режима для аргумента repeat, затем вернуться в режим вставки, чтобы ввести тире, затем выйти, чтобы вставить фактические тире, а затем вернуться в режим вставки продолжать печатать. Последовательность очень длинная:

Esc 8 0 a - Esc a

Было бы неплохо не включать и выключать режимы.

Ответ 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>

Ответ 2

Если вы в порядке, оставив режим INSERT только один раз (в конце), эта последовательность работает:

<C-o>80i-<Esc> 
  • <C-o> используется для выдачи нормальных команд, не выходя из режима INSERT,
  • 80 повторение,
  • i для вставки,
  • - символ, который вы хотите вставить,
  • <Esc>, чтобы выйти из режима INSERT.

Другой, не обратившись в режим INSERT:

<C-o>:norm 8ia<CR>

Ответ 3

Esc n i c Esc Esc.

например. Esc 4 i J Esc Esc выводит JJJJ.

Ответ 4

<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.

Ответ 5

Есть много других способов, но 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>

Ответ 6

Вы также можете сделать,    <Б > Esc ni hello there Esc Esc

где, n - количество повторов.

например.,   Esc 5i hello there Esc Esc

Ответ 7

Вы сказали, что было бы "приятно" оставаться в режиме "Вставить", однако в командном режиме следующий метод избежал бы вашего второго ESC: -

Пока я знаю, что эта почта старая, кажется, стыдно пропустить очевидную опцию "Вырезать/Копировать и Вставить"...

x... cut

8 0... количество копий

p Вставить

Примечание. Это похоже на метод, предложенный Мартином Беккетом, однако я получаю задержку при выдаче этой команды, возможно, потому, что он несколько раз переключает режимы, эта команда выполняется мгновенно.

Ответ 8

Поздний ответ, но за то, что он стоит, если вы хотите, чтобы его рассылали спам, вы можете использовать Команда "повторить последнюю команду": .

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).

Я нахожу это особенно полезным, когда я не знаю точно, сколько повторений я хочу сделать, но знаю визуально, как долго я хочу, чтобы это было. В основном взрывайте ., пока мои глаза не будут довольны.

Ответ 9

В дополнение к функции записи, которая будет повторяться несколько раз, вы можете использовать <C-x><C-l>: если у вас уже есть строка, содержащая 80 тире, запись нескольких тире в начале новой строки, а затем нажатие <C-x><C-l> завершается линии, которые начинаются с этих нескольких тире, которые, вероятно, будут иметь линию с 80 тире. Я использовал для записи горизонтальных линий (78 тире) в файлах справки таким образом.