Як повторити редагування у кількох рядках у Vim?


122

Я знаю, що у Vim я часто можу повторити команду, просто додавши число перед нею. Наприклад, можна видалити 5 рядків:

5dd

Також часто можна вказати діапазон рядків, наприклад, застосувати команду

:10,20s:hello:goodbye:gc

Як я можу виконати "вертикальне редагування"? Наприклад, я хотів би, наприклад, вставити певний символ, наприклад, кома, на початку (пропускаючи пробіли, тобто те, що ви отримаєте, якщо набрати кому після Shift-I в командному режимі) кожного рядка в заданому дальність. Як цього можна досягти (не вдаючись до періоду вниз-періоду-періоду донизу)?

Відповіді:


107

:10,20s/^/,/

Або скористайтеся макросом, запишіть за допомогою:

q a i , ESC j h q

використовувати з:

@ a

Пояснення: q aпочинає запис макросу для реєстрації a, qзакінчує запис. Є регістри aв zнаявності для цього.


Дякую. Що робити, якщо я хотів еквівалент shift-i? Тобто, пропускаючи через початковий пробіл?
сафсд

2
Пояснення: ^\(\s*\)фіксує початковий пробіл і зберігає його в реєстрі, з яким потім можна прочитати \1.
Svante

136

Ctrl-v переходить у зоровий режим блочно. Потім ви можете рухатись ( hjkl-наче, як звичайно), а якщо ви хочете вставити щось у кількох рядках, використовуйте Shift- i.

Отже, для тексту:

abc123abc
def456def
ghi789ghi

якщо ви потрапили Ctrl- vклацніть курсором на 1, натиснітьj двічі, щоб спуститися на два стовпчики, то Shift- i,ESCваш текст виглядатиме так:

abc,123abc
def,456def
ghi,789ghi

(багаторядкова вставка має невелике відставання, і не відображатиметься, поки ПІСЛЯ ви не натиснете ESC ).


3
Приємно. Ctrl-V означає великі регістри, до речі, можна сказати Ctrl-Shift-v
Svante

8
насправді це або CTRL-v, або CTRL-V. Vim нечутливий до регістрів для кодів CTRL (див. Довідку CTRL- {char}).
чемпіон

2
після пошуку трохи того, чому цей метод не працює, це тому, що він використовує капітал I (shift-i) замість i (також це був лише ctrl-v, оскільки ctrl-shift-v перемістив мене до кінця)
Вілліфрог

4
Мені цікаво. Чому вони просто не використовуються iбез клавіші shift?
off99555

1
i без зсуву вставляється в поточне положення. shift + i вставляється на початку рядка
Кевін P


44

Якщо ви вже використовуєте "." щоб багато разів повторювати вашу останню команду, я вважав це найзручнішим рішенням поки що. Це дозволяє повторити останню команду в кожному рядку візуального блоку за допомогою

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Це корисно, але також обмежено, оскільки .в візуальному режимі працює оперативна лінія. Я думаю, що в цьому випадку візуальний режим іноді може бути зручним для вибору діапазону рядків. Але команди та макроси в цьому випадку більш гнучкі та потужні.
Бор

23

Я вважаю, що це найпростіший спосіб зробити це

1) записати макрос для одного рядка, назвати його "a"; в цьому випадку один тип

qa I, ESC jq

2) виберіть блок рядків, до якого потрібно застосувати макрос

3) використовувати функцію "норма" для виконання макросу "а" над цим блоком рядків, тобто

:'<,'>norm@a

17

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

q a I , ESC j q

щоб повторити це 5 разів, ви входите

5 @ a


2

Коли ваша редакція вже збережена в .операторі, виконайте наступне:

  1. Виберіть текст, який потрібно застосувати оператору, щоб використовувати візуальний режим
  2. Потім запустіть команду :norm .

1

Окрім макросів, як уже відповіли, для конкретного випадку вставлення коми в діапазон рядків (скажімо, з рядка 10 до 20) ви можете зробити щось на кшталт:

:10,20s/\(.*\)/,\1

Тобто, ви можете створити нумерований груповий збіг з \ (і \) і використовувати \ 1 у рядку заміни, щоб сказати "замінити вмістом відповідності".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.