Как я могу вставить текст в середине строки в несколько строк в 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)?

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

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

Аллен
источник
1
Комментарии в стиле C: / * * / Комментарии в стиле BCPL //
Уильям Перселл,

Ответы:

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
Вариант ответа - пометить визуальный блок с помощью shift + V, а затем изменить блок в режиме ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Примечание, чем "'< , '> "автоматически распечатывается vim, когда вы нажимаете": ".
dimba
1
Для раскомментирования используйте визуальный блок (отметьте Ctrl + V). Один столбец со знаком комментария «//» отмечен, нажмите «d», чтобы удалить комментарии. не забывайте и о комментариях C ++ (/ ** /) тоже :)
dimba
9
Стоит отметить, что в Linux мне приходилось выходить из режима вставки до того, как префикс применялся ко всем строкам, и это заглавная буква, которая мне нужна для перехода в режим вставки из визуального режима, то есть Shift + I, префикс типа, Escape, Escape.
Джошуа Энфилд
6
Это не работает со шпатлевкой. Когда нажимаю, iничего не происходит. Когда я нажимаю, shift+iвыделение исчезает, но я могу вставить текст (в текущем месте, где находится только курсор).
Jürgen Paul
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 (включительно). '<,'>означает строки в текущем визуальном выделении.
rampion
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

: normal приходит на помощь!

:%norm Wibar(

:%norm WEa)

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

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

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

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

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

:%norm Wibar(ctrlvESCEa)

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

Кибер Оливейра
источник
3

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

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

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

Годфри Парк
источник
Следует mвместо того, 'чтобы установить новый маркер. 'для перехода к линии существующего маркера. `переходит к строке и столбцу этого маркера.
tiktak
1

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

%s/^/<text you want to prepend>/
Арториас2718
источник
0

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

Максвелл
источник