Як я можу вставити текст посередині рядка до декількох рядків у Vim?


91

Скажімо, у мене є десять рядків, і я хочу додати текст до якогось слова, яке зустрічається в цих рядках? Це не повинно бути на початку рядка.

Від:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

до:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Це також можна не тільки випереджати , bar(але на самому справі оточують fooз bar(foo)?

Я також хотів би швидко додати //коментарі до декількох рядків (коментарі у стилі С).

Я використовую Vim / GVim 7.2.


1
Коментарі до стилю C / * * / Коментарі до стилю BCPL //
William Pursell

Відповіді:


169

Перейдіть до першого foo, натисніть Ctrl-, vщоб увійти в режим візуального блокування, і натискайте вниз, доки fooне позначені всі рядки з . Потім натисніть Shift-, iщоб вставити на початок (блоку). Коли ви закінчите і натисніть Esc, вставлені символи будуть додані до кожного рядка зліва від позначеного блоку.

Щоб вставити в кінець, натисніть ще раз Ctrl- v, перемістіться вгору / вниз, щоб позначити всі уражені рядки, а потім натисніть Endабо, $щоб продовжити виділення до кінця рядків. Тепер ви можете натиснути Shift-, aщоб додати в кінці всіх рядків, як і раніше Shift- i.

Візуальний вибір також можна зробити за допомогою звичайних команд руху. Отже, щоб прокоментувати цілий блок на мові C, ви можете перейти до відкриваючої дужки та ввести Ctrl- v % Shift- i // Esc.


5
Просто доповнення: якщо Ctrl-V не запускає режим візуального блокування у Vim в Windows, натомість слід використовувати Ctrl-Q.
Пол

3
Варіацією відповіді тоді є позначення візуального блоку зі зміщенням + V змінити блок у режимі ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Note ніж "'< , '> "автоматично друкується vim при натисканні": ".
dimba

1
Для коментування використовуйте візуальний блок (позначте Ctrl + V). Один стовпець зі знаком коментаря "//" позначений, натисніть "d", щоб видалити коментарі. не забувайте і про коментарі на C ++ (/ ** /) теж :)
dimba

9
Варто зазначити, що в Linux мені потрібно було вийти з режиму вставки до того, як префікс застосовувався до всіх рядків, і це велика буква, яка мені потрібна для переходу в режим вставки з візуального режиму - тобто Shift + I, префікс типу, Escape, Escape.
Джошуа Енфілд,

6
На шпаклівці це не працює. Коли я натискаю, iнічого не відбувається. При натисканні shift+iвиділення зникає, але я можу вставити текст (у поточному місці, де знаходиться лише курсор).
Юрген Пауль

44

Щоб відповісти на ваше перше запитання, нижче

:%s/foo/bar(&)/g

шукатиме fooі оточуватиме відповідний візерунок bar(). /gРобитиме це кілька разів в одному рядку.

Оскільки ви просто співпадаєте foo, ви можете зробити просте :s/foo/bar(foo)/g. Однак вищезазначене спрацює, якщо ви вирішите зіставити регулярний вираз, а не просте слово (наприклад f[a-z][a-z]). "&" У вищезазначеному зображує те, що вам відповідало.


У мене була велика довга відповідь з макросами. Це набагато простіше :-)
Брайан Рамзі,

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

Здається, це працює на всі рядки ... зверніть увагу на:% s та / g.
ojrac

що цікаво, так це:% s / foo / bar (&) / gc не підтверджує - 'c' не впливає .. тьфу

1
Текст між :і sвизначає, на яких рядках він працює. Ніщо не означає лише поточний рядок. 1,30означає рядки від 1 до 30 (включно). '<,'>означає лінії поточного візуального виділення.
чемпіон

17

Для префікса набору рядків я використовую один із двох різних підходів:

Одним із підходів є вибір блоку (згаданий sth). Загалом, ви можете вибрати прямокутну область з ctrl-Vподальшим переміщенням курсору. Коли ви виділите прямокутник, натискання shift-Iвставить символи з лівої сторони прямокутника або shift-Aдодасть їх праворуч від прямокутника. Отже, ви можете використовувати цей прийом, щоб створити прямокутник, що включає крайній лівий стовпець рядків, які потрібно префіксувати, натискати shift-I, вводити префікс, а потім натискати escape.

Інший підхід полягає у використанні заміни (як згадував Брайан Егню). Заміна Брайана вплине на весь файл (% у команді означає "всі рядки"). Щоб вплинути лише на кілька рядків, найпростіший підхід - це натиснення shift-V(що включає режим візуального рядка), перебуваючи на першому / останньому рядку, а потім перехід до останнього / першого рядка. Потім введіть:

:s/^/YOUR PREFIX/

^ - це регулярний вираз (у цьому випадку початок рядка). Набравши це у режимі візуального рядка, ви побачите '<,'>, вставлене перед s автоматично. Це означає, що діапазоном заміни буде візуальний вибір.

Додаткова порада: якщо ваш префікс містить скісні риски, ви можете або уникнути їх за допомогою зворотної риски, або ви можете використовувати інший розділовий символ як роздільник у команді. Наприклад, щоб додати коментарі до рядків на C ++, я зазвичай пишу:

:s:^:// :

Для додавання суфікса підхід до заміни, як правило, простіший, якщо всі ваші рядки не мають однакової довжини. Просто використовуйте $ для шаблону замість ^ і ваш рядок буде додано замість попередньо очікуваного.

Якщо ви хочете додати префікс і суфікс одночасно, ви можете зробити щось подібне:

:s/.*/PREFIX & SUFFIX/

. * Відповідає цілому рядку. Значок & в заміні повертає відповідний текст (цілий рядок) назад, але тепер до нього додаються префікс та суфікс.

До речі: коли ви коментуєте код, ви, ймовірно, захочете його прокоментувати пізніше. Ви можете використовувати visual-block ( ctrl-V), щоб виділити косу риску, а потім натиснути d, щоб видалити їх, або ви можете скористатися заміною (можливо, з виділенням візуальної лінії, зробленої за допомогою shift-V), щоб видалити провісні скісні риски таким чином:

:s:// ::

6

: нормально на допомогу!

:%norm Wibar(

:%norm WEa)

: норма (al) повторює команди так, ніби ви їх ввели:

W - переходить до наступного слова

i - запускає режим вставки

bar (- вводить послідовність 'bar ('

Або в один рядок:

:%norm Wibar(ctrlvESCEa)

Якщо у вас Windows, введіть ctrlqзамість ctrlv.


3

Ще однією можливістю (можливо, не такою корисною у вашому тестовому випадку, але зручною в інших ситуаціях) є відгородження ділянки, яку ви хочете змінити, позначками.

  • Помістіть курсор у будь-який верхній рядок і натисніть 'a
  • Помістіть курсор у будь-який край останнього рядка та натисніть 'b
  • Видайте команду :'a,'b s/foo/bar(&)/

Зазвичай мені подобається режим візуального блокування, якщо все видно на екрані, і зазвичай я віддаю перевагу позначкам, якщо початок і зупинка розділені багатьма екранами.


Це має бути mзамість того, 'щоб встановлювати новий маркер. 'призначений для переходу до лінії існуючого маркера. `переходить до рядка та стовпця цього маркера.
тиктак

1

Ще одним простим регулярним виразом є:

%s/^/<text you want to prepend>/

0

Для коментарів у стилі С використовуйте відповідь на регулярне вираження Брайана, і збігайтесь у рядку, що закінчується $, і вставляйте.

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