Как добавить текст в конце каждой строки в Vim?

117

В Vim у меня есть такой текст:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Я хотел бы добавить "," в конце каждой строки. Предыдущий текст станет следующим:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Кто-нибудь знает как это сделать? Можно ли для этого использовать режим визуального блока?

Грейс Шао
источник
Аналогичный вопрос здесь .
glts

Ответы:

164

Это будет делать это с каждой строкой в ​​файле:

:%s/$/,/

Если вы хотите создать подмножество строк вместо всего файла, вы можете указать их вместо %.

Один из способов - сделать визуальный выбор, а затем ввести :. Он заполнится :'<,'>за вас, затем вы наберете остальное (обратите внимание, что вам нужно только добавить s/$/,/)

:'<,'>s/$/,/
Алан Карри
источник
4
В последней строке есть доп ', должно быть :'<,'>s/$/,/.
cjg
почему в нем нет необходимости g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen, потому что /$/все равно соответствует только один раз.
Bubaya
158

На самом деле есть способ сделать это с помощью режима визуального блока. Простое нажатие $Aв режиме визуального блока добавляет в конец всех строк в выделенном фрагменте. Добавленный текст появится во всех строках, как только вы нажмете Esc.

Итак, это возможное решение:

vip<C-V>$A,<Esc>

То есть в обычном режиме Visual выберите абзац vip, переключитесь в режим визуального блока CTRLV, добавьте ко всем строкам $Aзапятую ,, затем нажмите Escдля подтверждения.

Документация находится по адресу :h v_b_A. Существует даже иллюстрация того , как это работает в разделе Примеры: :h v_b_A_example.

glts
источник
1
Нет, это стандартный Vim: выберите несколько строк в режиме визуального блока (с помощью C-V), затем переместите курсор в конец строки $и добавьте ко всем из них A. Вам понравится :h v_b_A, и это действительно основательно.
glts 04
1
О, я вижу, что происходит! Я обычно использую Ctrl-C вместо <Esc> для выхода из режима вставки, и, очевидно, с Ctrl-C это не работает! Как странно.
weronika 04
3
Вы можете сохранить нажатие клавиши, используя <C-V>ipвместо vip<C-V>.
Аарон Тома
1
@accolade, таким образом не переходит в режим визуального блока и не будет работать. <CV> должен произойти снова, если вы сделаете это таким образом.
imagineerThat
@imagineer Это странно - у меня это работает - должно быть, из-за какой-то нестандартной опции. (Нет 'virtualedit'- я это тестировал.) Я подтверждаю, что это не работает в чистом vim. Спасибо за замечание!
Аарон Тома,
44

Другое решение, использующее еще одну замечательную функцию:

:'<,'>norm A,

Смотрите :help :normal.

Ромэн
источник
1
@Swiss, тогда тебе понравится этот комментарий .
romainl
1
@Swiss, вы можете также , как udioca подвержена влиянию на :normal. Я нашел это информативным!
Conner
1
Не знал об этом сабреддите. Спасибо.
romainl
33

ex режим самый простой:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Нед Батчелдер
источник
10

Команда замены может применяться к визуальному выделению. Сделайте визуальный блок по линиям , которые вы хотите изменить, и введите :, а также уведомление о том , что командная строка инициализации , как это: :'<,'>. Это означает, что команда замены будет работать с визуальным выделением, например:

:'<,'>s/$/,/

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

:'<,'>s/\s*$/,/

Это заменит любое количество пробелов перед концом строки на запятую, эффективно удалив конечные пробелы.

Одни и те же команды могут работать на диапазоне строк, например , в течение следующих 5 строк: :,+5s/$/,/или для всего буфера: :%s/$/,/.

pb2q
источник
3

Если вы хотите добавить ',' в конце строк, начинающихся с 'key', используйте:

:%s/key.*$/&,
детские перила
источник
Или :g/key/s/$/,. Смотрите :help :global.
romainl
2

У меня есть <M-DOWN>(alt стрелка вниз), <DOWN>.чтобы я мог очень быстро повторить последнюю команду в серии строк. с этим отображением я могу:

A,<ESC>

А затем удерживайте alt, нажимая несколько раз, чтобы добавить запятую в конец каждой строки.
Это хорошо работает для меня, потому что позволяет очень хорошо контролировать, какие строки делают и не получают изменений.
(У меня также есть другие стрелки, отображенные аналогично, чтобы их можно было легко повторить .)

Вот строка сопоставления, которую нужно вставить в vimrc:

map <M-DOWN> <DOWN>.
Сэм Бринк
источник
1
:%s/$/,/g

$ соответствует концу строки

Калхартт
источник
2
Это тоже добавит $к линии, а не только ,.
ZyX
2
/gиспользуется для выполнения замены при каждом появлении в строке. Поскольку $в строке только один, вы можете спокойно его уронить.
romainl
Да, моя ошибка, $. и / g от habbit, и да, это необязательно.
Kalhartt
1

Следующий макрос также можно использовать для выполнения вашей задачи.

qqA,^[0jq4@q
dvk317960
источник