Как мне повторить редактирование нескольких строк в 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? То есть пропускать начальный пробел?
saffsd

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-кодов (см .: help CTRL- {char}).
rampion

2
после небольшого поиска того, почему этот метод не работал, потому что он использует заглавную I (shift-i) вместо i (кроме того, это был только ctrl-v, поскольку ctrl-shift-v переместил меня в конец)
Willyfrog 09

4
Мне любопытно. Почему бы им просто не использовать iбез клавиши Shift?
off99555

1
i без сдвига - вставка в текущую позицию. shift + i - вставить в начало строки
Кевин П.


44

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

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

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

23

Я считаю, что самый простой способ сделать это -

1) запишите макрос для одной строки, назовите его «а»; в этом случае один тип

qa I, ESC jq

2) выберите блок строк, к которому вы хотите применить макрос

3) используйте функцию 'norm' для выполнения макроса 'a' над этим блоком строк, т.е.

:'<,'>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.