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


141

Чи є спосіб повторення символу в режимі вставки Vim? Наприклад, скажіть, що я хотів би вставити 80 тире в щось на зразок emacs, який би я набрав:

Ctrl+U   8 0 -

Єдиний спосіб, коли я знаю, як це зробити у VIM, - це вийти з звичайного режиму для повторного аргументу, потім повернутися в режим вставки, щоб набрати тире, потім вийти, щоб вставити фактичні тире, а потім повернутися в режим вставки для продовження набравши текст. Послідовність дійсно довга:

Esc 8 0 a - Esc a

Було б непогано не включати та вимикати режими.

Відповіді:


20

Трохи інша версія рішення 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>

259

Якщо ви все в порядку, залишаючи режим INSERT лише один раз (наприкінці), ця послідовність працює:

Ctrl+o 80i- Esc

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

Ще один, коли НІКОГО не залишати режим INSERT:

Ctrl+o :norm 8ia Return


6
Ваша відповідь та відповідь ОП - це єдині, які працюють на мене.
twblamer

34
"<Co> використовується для видачі звичайних команд, не виходячи з режиму INSERT" виграє цю нагороду "я не вірю-я ніколи не знав"!
Stabledog

11
<C-o>це скорочення для Ctrl+ o.
Шон Люттін

3
Є також :normalкоманда, яка дозволяє видавати їх з командного рядка. Іноді досить корисно.
Марк Рід

157

Escnic Esc Esc.

Наприклад Esc4iJEsc Esc, виведемо JJJJ.


3
На жаль, це не працює на мою виму, якщо ви не повернетесь до звичайного режиму.
Cthutu

5
Але це найкраща відповідь "vim чином".
Drasill

1
Мені завжди здається, що я повертаюсь до режиму вставки, коли натискаю кнопку i, тож вставляю лише ХАРАКТЕР. Як я це працюю?
Severo Raz

1
Це точна послідовність команд, яких OP хотіла уникнути .
Кенні Евітт

1
Це може бути не відповідь на поставлене запитання, але це vim спосіб зробити це, і це відповідь на запитання, яке я шукав.
Майкл Леонард

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 хотіла уникнути .
Кенні Евітт

13

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

Insert mode
-
Esc
80.

Детальніше про одноразове повторення: :help .


Дякую, але це рішення вимагає виходу з режиму вставки.
Cthutu

8

Ви також можете зробити це, Escnihello there EscEsc

де, n - кількість повторів.

наприклад, Esc5ihello there EscEsc


Це схоже на точний дублікат відповіді Мартіна Беккета
mkobit

Це не точний дублікат. Інший для мене не працював. Тут я зрозумів, що після цього мені потрібно Escдвічі натиснути . Дякуємо @prashant
Шрідхар Сарнобат

7

Є багато інших способів, але AFAIK, той, який ви описуєте, є найкоротшим. У вим ви, як правило, повинні провести свій час в командному режимі, так що це буде всього 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

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

Хоча я знаю, що ця публікація стара, здається соромно пропустити очевидний варіант "Вирізати / скопіювати та вставити" ...

x ... вирізати

80 ...кількість копій

p Вставити

Примітка. Це схоже на метод, запропонований Мартіном Бекеттом, однак я отримую затримку при видачі цієї команди, можливо, тому що вона перемикає режими кілька разів, ця команда виконується миттєво.


1
Мені довелося скористатися, v yщоб увійти у візуальний режим, потім потягнути, а потім 80 pвставити його 80 разів. Я щось пропускаю, чи ти забув крок?
alexanderbird

Добре помічений, я повинен був використовувати "x", щоб вирізати, а потім вставити. Дякую, що я змінив свою відповідь.
Іньока

1
приємно, оскільки це насправді швидше, ніж типовий метод повторення.
допоміжний

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

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


3

Я здивований, що ніхто ще не запропонував цього:

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

Це є:

  • Натисніть Ctrl-r=
  • У отриманому запиті введіть repeat('-', 80)
  • Натисніть Enter

Працює для повторення будь-якого символу будь-яку кількість разів.

Для цього використовується більше натискань клавіш, ніж відповідь @ romainl, але він взагалі не залишає режим "Вставка".


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.