Скажи у меня есть следующее

DRAFT,
SAVED,
ARCHIVED,
DELETED;

И я хочу следующее:

DRAFT("draft"),
SAVED("saved"),
ARCHIVED("archived"),
DELETED("deleted");

Как я могу сделать это с Vim? Я предполагаю, что я могу использовать режим визуального блока?

Я понимаю, что могу легко сделать это с помощью sed, но мне интересно, чтобы я мог сделать это БЕЗ выхода из vim.

4 ответа4

3
:%s/\v(\w*)([,;])/\1("\L\1")\2

кажется, делает то, что вы просите.

  • \v уменьшает количество обратных слешей
  • (\w*) первая группа, любое количество символов "слово"
  • ([,;]) вторая группа , или ;
  • \1 повторно использовать первую группу
  • ("\L\1") первая группа в нижнем регистре между кавычками и скобками
  • \2 вторая группа
2
:1,$s/\<\(\w*\)\>/\1("\L\1")/

Это находит слово \<(w*\)\> затем помещает его как есть \1 и строчные буквы \L\1

0

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

qqyeea("<C-R>0")<ESC>v%gu+q3@a

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

Разбивая мое решение:

  • qa начинает запись макроса в регистр 'a'.
  • ye перемещаетесь от текущей позиции курсора к концу слова, сохраняя его в регистре "и 0". (Я получу к нему доступ только через регистр 0, но на самом деле он сохраняется в обоих)
  • e перемещает курсор в конец слова
  • a входит в режим вставки ПОСЛЕ курсора (между словом и запятой)
  • Далее я ввожу какой-то стандартный текст. Интересный бит это <C-R>0 . В режиме вставки <C-R>n означает «вставить текст, который находится в регистре n». Если бы я выполнял эту задачу нормально (вместо того, чтобы объяснять это кому-то еще в текстовой форме), я бы на самом деле использовал <C-R>" здесь, но 0 легче визуально отличить от буквальных" символов, окружающих его.
  • <ESC> возвращает нас в нормальный режим. Теперь курсор находится на закрытии), который был последним символом, который мы ввели в режиме вставки.
  • v входит в визуальный режим.
  • % переводит курсор назад в открытую круглую скобку, соответствующую закрывающей круглой скобке, в которой мы сейчас находимся, поэтому наш визуальный выбор теперь покрывает строку ("DRAFT") .
  • gu конвертирует визуально выбранную строку в нижний регистр. Это не влияет на скобки или кавычки в визуальном отборе.
  • + переводит курсор в начало следующей строки, готовый снова выполнить тот же набор команд.
  • q заканчивает запись макроса.
  • 3@a запускает наш макрос 'a' три раза, повторяя все, что мы делали в первой строке в трех последующих строках.
0

Для людей, которые предпочитают рубин:

:rubydo x = $_[0..-2] ; $_ = "#{x}(\"#{x.downcase}\")#{$_[-1]}"

x = $ _ [0 ..- 2] -> не сохранять последний символ (, или;)

$ _ [- 1] -> "," или ";"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .