Как мне повторить редактирование нескольких строк в Vim? - PullRequest
105 голосов
/ 10 декабря 2008

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

5dd

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

:10,20s:hello:goodbye:gc

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

Ответы [ 9 ]

111 голосов
/ 10 декабря 2008

Ctrl - v входит в визуальный режим блочно. Затем вы можете двигаться ( h j k l -в порядке, как обычно), и если вы хотите вставить что-то в несколько строк , используйте Shift - i .

Итак, для текста:

abc123abc
def456def
ghi789ghi

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

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

(многострочная вставка имеет небольшую задержку и не будет отрисовываться, пока ПОСЛЕ того, как вы нажмете ESC ).

94 голосов
/ 10 декабря 2008

:10,20s/^/,/

Или используйте макрос, запишите с помощью:

q a i , ESC j h q

использовать с:

@ a

Объяснение: q a начинает запись макроса для регистрации a, q заканчивает запись. Для этого доступны регистры от a до z.

51 голосов
/ 18 декабря 2008

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

:10,20 normal I,
40 голосов
/ 09 ноября 2011

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

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>
18 голосов
/ 28 ноября 2009

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

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

q a I, ESC j q

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

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

:'<,'>norm@a
15 голосов
/ 10 декабря 2008

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

q a I , ESC j q

чтобы повторить это 5 раз, вы вводите

5 @ a
2 голосов
/ 07 января 2009

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

1 голос
/ 10 декабря 2008

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

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

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

0 голосов
/ 14 февраля 2019

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

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