Как добавить текст в конце каждой строки в 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.


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/$/,/.



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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.