Как я могу добавить текст в середине строки к нескольким строкам в Vim?


скажем, у меня есть десять строк, и я хочу добавить текст к некоторому слову, которое встречается в этих строках? Это не обязательно должно быть в начале строки.

от:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

to:

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

можно ли также не только добавитьbar( но на самом деле окружают foo С bar(foo)?

Я также хотел бы быстрый способ добавить // комментарии к нескольким строкам (комментарии в стиле C).

Я использую Vim / GVim 7.2.

7 88

7 ответов:

перейти к первой foo, нажмите клавишу Ctrl -v чтобы войти в режим визуального блока и нажимайте, пока все строки с foo помеченные. Затем нажмите Shift -Я вставить в начале (блока). Когда вы закончите и нажмите Esc, вставленные символы будут добавлены в каждую строку слева от отмеченного блока.

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

визуальный выбор можно также сделать с нормальными командами движения. Поэтому, чтобы прокомментировать весь блок в C, вы можете перейти к открывающей скобке и ввести Ctrl -v%Shift -Я// Esc.

чтобы ответить на ваш первый вопрос, ниже

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

искать foo, и окружить соответствующий шаблон с bar(). Элемент /g будет делать это несколько раз в одной строке.

так как вы просто соответствуете foo, вы могли бы сделать простой :s/foo/bar(foo)/g. Однако это будет работать, если вы решите сопоставить регулярное выражение, а не простое слово (например,f[a-z][a-z]). '&'В приведенном выше представляет то, что вы сопоставили.

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

один подход-это выбор блока (упомянутый sth). В общем, вы можете выбрать прямоугольную область с ctrl-V с последующим движением курсора. После того как вы выделили прямоугольник, нажмите shift-I будет вставлять символы в левой части прямоугольника, или shift-A добавит их в правой части прямоугольника. Так что вы можете использовать эту технику, чтобы сделать прямоугольник, который включает в себя самый левый столбец строк, которые вы хотите префикс, нажмите shift-I, введите префикс, а затем нажмите escape.

другой подход заключается в использовании замены (как упоминалось Брайаном Агню). Замена Брайана повлияет на весь файл (%в команде означает "все строки"). Чтобы повлиять всего на несколько строк, самый простой подход-ударить shift-V (который включает режим визуальной линии) в то время как на первой/последней строке, а затем перейти к последняя / первая строка. Затем введите:

:s/^/YOUR PREFIX/

^ - это регулярное выражение (в данном случае начало строки). Набрав это в режиме визуальной линии, вы увидите', вставленный перед s автоматически. Это означает, что диапазон подстановки будет визуальным выбором.

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

:s:^:// :

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

если вы хотите добавить префикс и суффикс одновременно, вы можете сделать что-то вроде этого:

:s/.*/PREFIX & SUFFIX/

The .* соответствует всей линии. & В замене помещает соответствующий текст (всю строку) назад, но теперь он будет иметь свой префикс и суффикс добавил.

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

:s:// ::

: нормальный к спасению!

:%norm Wibar(

:%norm WEa)

:norm (al) воспроизводит команды, как если бы вы их набрали:

W-переходит к следующему слову

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

бар (типы последовательность баре('

или в одной строке:

:%norm Wibar(ctrlv ESCEa)

если вы используете Windows, то введите ctrlq вместо ctrlv.

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

  • поместить курсор в любом месте в верхней строке и нажать 'a
  • поместить курсор в любом месте в последней строке и нажмите клавишу 'b
  • выдать команду :'a,'b s/foo/bar(&)/

Мне обычно нравится режим визуального блока, если все виден на экране, и я обычно предпочитаю метки, если старт и стоп разделены многими экранами.

еще одно простое регулярное выражение:

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

для комментариев в стиле C используйте ответ на регулярное выражение Брайана и сопоставьте конец строки $ и вставить прочь.