Как добавить текст в середине строки к нескольким строкам в 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
Для комментариев в стиле С используйте ответ регулярного выражения Брайана и сопоставьте его по завершении строки $
и вставьте его.