Повторяющиеся символы в режиме вставки VIM


144

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

Ctrl+U   8 0 -

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

Esc 8 0 a - Esc a

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

Ответы:


21

Немного другая версия решения 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>

268

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

Ctrl+o 80i- Esc

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

Еще один, НИКОГДА не выходя из режима INSERT:

Ctrl+o :norm 8ia Return


6
Ваш ответ и ответ OP - единственные, которые работают для меня.
twblamer

36
«<Co> используется для выполнения обычных команд, не выходя из режима INSERT» - моя награда «Не могу поверить, я никогда не знала об этом»!
Stabledog

11
<C-o>сокращение от Ctrl+ o.
Шон Латтин

3
Также есть :normalкоманда, которая позволяет запускать их из командной строки. Иногда весьма полезно.
Марк Рид,

159

Escnic Esc Esc.

Например, Esc4iJEsc Escвыведет JJJJ.


3
К сожалению, это не работает с моим vim, если вы не вернетесь в нормальный режим.
Cthutu

6
Но это лучший ответ на «vim way».
Drasill

1
Я всегда возвращаюсь в режим вставки, когда нажимаю i, поэтому я вставляю только ХАРАКТЕР. Как мне с этим работать?
Северо Раз

1
Это точная последовательность команд, которых OP хотел избежать .
Кенни Эвитт,

1
Возможно, это не ответ на заданный вопрос, но это лучший способ сделать это, и это ответ на вопрос, который я искал.
Майкл Леонард

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

8
Это точная последовательность команд, которых OP хотел избежать .
Кенни Эвитт,

17

При однократном повторении:

Insert mode
-
Esc
80.

Подробнее об одиночном повторе: :help .

Выведет 80 -

---------------------------------------------------------------------------------

Спасибо, но это решение требует, чтобы вы вышли из режима вставки.
Cthutu

8

Вы также можете сделать, Escnihello there EscEsc

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

например, Esc5ihello there EscEsc


Это похоже на точную копию ответа Мартина Беккета
mkobit

Это не точная копия. Другой мне не подошел. Тут я понял, что Escпотом надо дважды нажимать . Спасибо @prashant
Шридхар Сарнобат

7

Есть много других способов, но, НАСКОЛЬКО, тот, который вы описываете, самый короткий. В 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>

У меня не получилось, но спасибо за ответ. Моего знания языка программирования vim недостаточно, чтобы понять, почему.
Cthutu

6

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

Хотя я знаю, что этот пост старый, мне жаль пропустить очевидную опцию «Вырезать / скопировать и вставить» ...

x ...порез

80 ...Количество копий

p Вставить

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


1
Пришлось использовать v yдля входа в визуальный режим, затем дергать, затем 80 p80 раз вставлять. Я что-то упустил, или ты забыл шаг?
alexanderbird

Хорошо заметный, я должен был использовать «x», чтобы вырезать, а затем вставить. Спасибо, я изменил свой ответ.
Inyoka

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

4

Я удивлен, что этого еще никто не предложил:

В режиме вставки используйте <C-r>=repeat('-', 80)<CR>

То есть:

  • Нажмите Ctrl-r=
  • В появившемся запросе введите repeat('-', 80)
  • Нажмите Enter

Работает для повторения любого символа любое количество раз.

При этом используется больше нажатий клавиш, чем в ответе @romainl, но режим вставки не выходит вообще.


3

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

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

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


2

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


1

Для такой несложной задачи abbreviationнадо подойти. Добавьте следующее в свой.vimrc

iab <expr> -- repeat('-', 80)

и с этого момента, когда вы вводите с --последующим пробелом (пока вы находитесь в режиме вставки), --будет автоматически преобразовано в -80 раз.

Используя эту функцию, repeatвы можете повторять строку столько раз, сколько захотите.

Обратите внимание, что вы можете протестировать его перед обновлением .vimrc, войдя в commandрежим и выполнив следующие:iab <expr> -- repeat('-', 80)


1

Я сделал это, не выходя из режима INSERT, выполнив следующие шаги.

  1. Включите режим INSERT.
  2. Введите одно прочерк "-".
  3. Ctrl + O
  4. строчная 'v' (для входа в -- (insert) VISUAL --режим)
  5. строчная 'y' (копировать)
  6. Ctrl + O
  7. Тип 80
  8. Затем следует строчная буква «p» (для вставки).

i - Ctrl+o v y Ctrl+o 80 p

Это напечатает все тире по горизонтали в одной строке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.