Заключить несколько строк в кавычки Vim

Заключить несколько строк в кавычки Vim

У меня есть блоки следующего вида:

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

Мне нужно заключить строки, в которых указано, что они должны быть заключены в кавычки, в кавычки:

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

Есть ли полуавтоматический способ сделать это с помощью Vim? Я подумал, что возможное решение может включать команду g.

решение1

Использование регулярных выражений:

:%s/.*is supposed.*/"&"/

Если под «полуавтоматическим» вы подразумеваете, что хотите получать подсказки перед каждой заменой, просто добавьте модификатор /cк шаблону замены:

:%s/.*is supposed.*/"&"/c

Объяснение

  • :%sозначает применить эту замену ко всем строкам в текущем буфере
  • Шаблон, который мы сопоставляем, — это любая строка, содержащая слова is supposed(если некоторые другие строки содержат слова «предполагается» без «быть заключенным в кавычки» после них, вы всегда можете изменить шаблон на.*is supposed to be enclosed in quotes.*
  • Строка, которую мы используем для замены сопоставленного шаблона, — это "&", где &обозначает то, что сопоставлено с шаблоном.

решение2

Известныйплагин объемного звучанияпредоставляет различные сопоставления, которые делают это быстро и легко. Чтобы цитировать целую строку (без отступа), просто используйте yss". Вы можете применить это ко всем соответствующим строкам вашего примера текста автоматически с помощью :globalкоманды и :normal:

:g/is supposed/normal yss"

Или просто выполните поиск соответствующих строк и повторите через nи.

решение3

Я почти всегда предпочитаю макросы для поиска и замены, потому что они более мощные и их легче запоминать, при этом сохраняя возможность интерактивной проверки перед прыжком. Попробуйте это в первой строке, которую вы хотите изменить (не вводите пробелы, которые я поставил вокруг ESC и ENTER для удобства чтения):

qqI" ESC $bea" ESC /is supposed ENTER zzq

Что оно делает:

  • qqзапускает макрос с именем «q» (qa запустит макрос «a»)
  • I" ESCВставляет " перед первым словом, а не в начале строки, как это было бы с "0", тем самым сохраняя обычно ценное пустое пространство.
  • $bea" ESCПереход к концу строки ($), но затем возврат на одно слово (b) и переход вперед к его концу (e), в конце добавляя (a) ". Этот маневр добавляется после последнего слова строки, даже если за ним следует обычно бесполезный завершающий пробел.
  • /is supposedВыполнив редактирование, он ищет следующее вхождение "is expected", которое может быть на много страниц ниже, и удобно размещает курсор там, чтобы вы могли посмотреть и решить, продолжать ли редактирование. Если "is expected" не найдено, макрос завершает работу без повреждений.
  • zzqхорошо центрирует строку на странице (zz), так что вы можете видеть несколько строк за пределами текущей. Полезно, когда вы быстро применяете макрос и хотите заглянуть на пару ходов вперед. "q" завершает определение макроса, который также называется "q".

Как использовать:

  • Первая строка уже была изменена при определении макроса выше.
  • Если произошла ошибка, вы можете просто отменить эту строку и повторить попытку.
  • Курсор теперь установлен на втором совпадении, если таковое имеется, и аккуратно отцентрирован на странице.
  • При желании вы можете применить макрос (или другие подобные макросы!) с помощью @q, который отредактирует строку и переместит вас на третье совпадение.
  • Вы можете повторно применить последний макрос с помощью @@ (быстрее, чем @q).
  • Вы можете сделать несколько одновременно, например: 111@@. Помните, что если при применении макроса возникнет ЛЮБАЯ ошибка, то дальнейших повторений не будет.
  • Или вы можете вручную пропустить макрос с помощью PageDown и подобных ему и повторно применить макрос.
  • И вы можете чередовать макросы с любыми другими правками.
  • И вы можете :tab далее применить этот макрос к другим буферам или файлам.
  • Вишенка на торте: макрос запоминается даже после выхода из vim!

Как только вы освоитесь с макросами, у вас появятся невероятные возможности!

решение4

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

Для этого перейдите в начало строки 2 и нажмите:

qq I" Escape A" Escape 3j q

Это процитирует первую строку и перенесет нас к следующей, которую нужно просмотреть. Затем вы можете нажать , @qчтобы воспроизвести все действия, которые вы только что совершили, или, скажем, 5@qсделать это пять раз.

Как это работает: q— это команда для начала записи макроса, который мы также вызываем q(можно выбрать любую букву). В этом макросе мы вставляем двойную кавычку в начале строки ( I"), выходим из режима вставки (Escape), добавляем двойную кавычку в конце строки ( A") и снова выходим из режима вставки. Мы спускаемся на три строки вниз ( 3j) к следующей строке, которую нужно закавычить. qостанавливает запись макроса.

После этого мы возвращаемся в то же место, откуда начали, поэтому мы можем запустить макрос ( @), который мы сохранили как q, чтобы сделать это снова для следующей пары строк. Со счетчиком перед @, как в 5@q, мы делаем это столько раз.


Вместо 3j, если интервалы нерегулярны, вы можете использовать }}k: перейти на два абзаца вниз к пустой строке после следующего (}}) и резервное копирование ( k). В любом случае запуск макроса одинаков.

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

Связанный контент