Як додати текст у кінці кожного рядка у Vim?


116

У Vim у мене є такий текст:

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

Я хотів би додати "," в кінці кожного рядка. Попередній текст стане наступним:

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

Хтось знає, як це зробити? Чи можна використовувати режим візуального блоку для цього?


Подібне запитання тут .
glts

Відповіді:


163

Це зробить це для кожного рядка у файлі:

:%s/$/,/

Якщо ви хочете зробити підмножину рядків замість цілого файлу, ви можете вказати їх замість %.

Один із способів - це зробити візуальний вибір, а потім набрати :. Він заповниться :'<,'>для вас, потім ви введете решту (Зверніть увагу, вам потрібно лише додати s/$/,/)

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

4
Останній ряд має додатковий ', має бути :'<,'>s/$/,/.
cjg

чому в цьому немає потреби g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen

@ ThorbjørnE.K.Christensen, тому що /$/відповідає лише один раз.
Бубая

156

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

Тож це можливе рішення:

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

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

Документація знаходиться за адресою :h v_b_A. Існує навіть ілюстрація того , як це працює в розділі Приклади: :h v_b_A_example.


1
Ні, це стандарт Vim: Виберіть кілька рядків у режимі візуального блоку (з C-V), потім перемістіть курсор до кінця рядка $та додайте їх до всіх A. Вам сподобається :h v_b_A, що справді ретельно.
glts

1
О, я бачу, що відбувається! Зазвичай я використовую Ctrl-C замість <Esc> для виходу з режиму вставки, і, мабуть, із Ctrl-C це не працює! Як дивно.
weronika

3
Ви можете зберегти натискання клавіші, використовуючи <C-V>ipзамість vip<C-V>.
Аарон Тома

1
@accolade, не переходить у режим візуального блоку таким чином і не працюватиме. <CV> потрібно повторити, якщо ви зробите це так.
уявіть, що

@imagineerТа, дивно - це працює для мене - повинно бути пов'язано з деяким не за замовчуванням варіантом. (Ні 'virtualedit'- я це перевірив.) Я підтверджую, що це не працює в чистому вигляді. Дякую за замітку!
Аарон Тома


33

колишній режим найпростіший:

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


3

Якщо ви хочете додати "," в кінці рядків, що починаються з "ключ", використовуйте:

:%s/key.*$/&,

Або :g/key/s/$/,. Див :help :global.
romainl

2

У мене <M-DOWN>(альт стрілка вниз) відображено <DOWN>.так, що я можу дуже швидко повторити останню команду в серії рядків. за допомогою цього картографування я можу:

A,<ESC>

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

Ось рядок відображення для вставки у ваш vimrc:

map <M-DOWN> <DOWN>.

1
:%s/$/,/g

$ відповідає кінець рядка


2
Це додасть $і лінії, а не лише ,.
ZyX

2
/gвикористовується для виконання підстановки при кожному виникненні рядка. Оскільки $в рядку є лише одна, ви можете сміливо її скинути.
romainl

Так, моя помилка, $. і / g - від хабіта, і так, це необов'язково.
kalhartt

1

Наступний Макрос також може використовуватися для виконання вашого завдання.

qqA,^[0jq4@q
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.