Как мне повторить редактирование нескольких строк в Vim?

122

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

5dd

Также часто можно указать диапазон строк для применения команды, например

:10,20s:hello:goodbye:gc

Как я могу выполнить «вертикальное редактирование»? Я хотел бы, например, вставить определенный символ, скажем, запятую, в начале (пропуская пробелы, то есть то, что вы получите, если вы введете запятую после Shift-I в командном режиме) каждой строки в данном ассортимент. Как это может быть достигнуто (не прибегая к периоду падения-периода-падения)?

saffsd
источник

Ответы:

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 - вставить в начало строки
Кевин П.
59

Вот для чего предназначена команда: norm (al):

: 10,20 нормальный 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
wimh
источник
2

Я использую блочный визуальный режим . Это позволяет вам выполнять вставку / редактирование в нескольких строках (также называемое «вертикальное редактирование»).

ONODEVO
источник
1
ваша ссылка не работает
Кристофер Хантер
2

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

  1. Выберите текст, к которому вы хотите применить оператор, в визуальном режиме
  2. Затем запустите команду :norm .
Ной
источник
1

Помимо макросов, как уже было сказано, для конкретного случая вставки запятой в диапазон строк (скажем, от строки 10 до 20) вы можете сделать что-то вроде:

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

То есть вы можете создать пронумерованное групповое совпадение с помощью \ (и \) и использовать \ 1 в строке замены, чтобы сказать «заменить содержимым совпадения».

Паоло Тедеско
источник