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

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

From:

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)?

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

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

Ответ 1

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

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

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

Ответ 2

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

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

будет искать foo и окружить согласованный шаблон bar(). /g будет делать это несколько раз в одной строке.

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

Ответ 3

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

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

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

:s/^/YOUR PREFIX/

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

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

:s:^:// :

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

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

:s/.*/PREFIX & SUFFIX/

.. * соответствует всей строке. И в замене помещается совпадающий текст (целая строка) назад, но теперь он добавит ваш префикс и суффикс.

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

:s:// ::

Ответ 4

: нормальный для спасения!

:%norm Wibar(

:%norm WEa)

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

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

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

bar (- набирает строку последовательности ('

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

:%norm Wibar( ctrl v ESC Ea)

Если вы используете Windows, введите ctrl q вместо ctrl v.

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

Для комментариев в стиле С используйте ответ регулярного выражения Брайана и сопоставьте его по завершении строки $ и вставьте его.