Повторяющиеся символы в режиме вставки VIM - PullRequest
117 голосов
/ 20 февраля 2011

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

Ctrl + U 8 0 -

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

Esc 8 0 a - Esc a

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

Ответы [ 11 ]

216 голосов
/ 27 апреля 2011

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

Ctrl + o 80i- Esc

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

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

Ctrl + o :norm 8ia Возврат

135 голосов
/ 20 февраля 2011

Esc n i c Esc Esc .

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

18 голосов
/ 27 апреля 2011
<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.
17 голосов
/ 20 февраля 2011

Немного другая версия решения 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>
7 голосов
/ 14 сентября 2018

Через один повтор:

Insert mode
-
Esc
80.

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

7 голосов
/ 17 мая 2016

Вы также можете сделать, Esc n i привет там Esc Esc

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

например., Esc 5i Привет Esc Esc

7 голосов
/ 20 февраля 2011

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

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

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

x ... вырезать

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

p Вставить

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

3 голосов
/ 04 сентября 2016

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

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 голосов
/ 20 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...