Копирование шаблона из набора линий в режиме Vim Ex

Я убираю мой vimrc.

Миссия:
- Копировать содержимое внутри одинарных кавычек (и желательно после косой черты)
- Вставьте их ниже строки 1

1: Name:
2: 
3: Bundle 'tpope/vim-rails'
4: Bundle 'tpope/vim-endwise'
5: Bundle 'mileszs/ack.vim'
6: Bundle 'scrooloose/nerdcommenter'
7: Bundle 'kana/vim-textobj-entire'
8: Bundle 'kana/vim-textobj-user'

Я знаю о

:{source_address}t{target_address}

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

:'<,'>/\/.*\'t1

Где я пытаюсь сопоставить шаблон, который:

  • Начинается с /
  • Может содержать материал в середине.*
  • Заканчивается на '

Очевидно, я в какой-то степени отключен. Есть идеи?

4 ответа

Решение

:t скопировать всю строку, а не matchstr

чтобы добиться того, что вы хотите, вам нужно matchstr() функция.

эта строка будет делать то же самое, но в обратном порядке. Надеюсь, это нормально для вас:

:'<,'>g/\/.*'/call append(1,matchstr(getline('.'),@/))

например, если я просто выберу первые две строки "Bundle" и выполню команду cmd, я получу:

1: Name:
/vim-endwise'
/vim-rails'
2: 
3: Bundle 'tpope/vim-rails'
4: Bundle 'tpope/vim-endwise'
.... (other lines)

Вы видите, что заказ был в обратном порядке.

Для сохранения заказа у вас есть варианты:

  • написать скрипт со списком
  • выберите эти "перевернутые" строки и выполните '<,'>g/.*/m1
  • назначьте matchstr для reg x, и 2put! x
  1. Дергать блок.
  2. Положите его туда, где вы хотите.
  3. Удалить то, что вы не хотите.

Предполагая, что курсор находится где-то в строке 1:

:3,8t.
:'[,norm dt/$x

Объяснение:

  • '[ а также '] отметьте начало и конец последнего изменения.
  • Мы хотим, чтобы диапазон начинался с первого Bundle линия, поэтому мы начнем с '[ отметка. Мы могли бы просто использовать 2 вместо этого, но это менее "волшебно".
  • Он заканчивается текущей строкой, которую мы можем опустить, потому что это значение по умолчанию.
  • Мы используем :normal выполнять команды нормального режима из командной строки.
  • Удаляем до первого / (dt/) и удалите последний символ в строке ($x) на одном дыхании.

По-другому:

:3,8t.
v'[
:'<,'>s/.*\/\(.*\)'/\1 ('<,'> being inserted automatically)

Проблема с тем, что вы делаете, заключается в том, что ex-команды работают в строках, а не в тех частях строк, о которых вы думаете. Вы не можете использовать :t Команда прямо так, чтобы скопировать то, что вам нужно.

Вероятно, есть способ сделать именно то, что вы думаете, но вот что я бы сделал, чтобы выполнить то, что вы хотите: скопируйте все строки 3-8, вставьте их ниже строки 1, а затем выделите интересующий вас текст.

Существует множество способов скопировать диапазон строк. Если вам нужна помощь с этим, прокомментируйте и спросите.

Теперь, как нам выделить часть в кавычках после косой черты? Мы можем просто сделать замену, используя в основном тот же шаблон, который вы написали:

:'<,'>s/.*\/\(.*\)'/\1

:t / :copy Команды (как и большинство команд Ex) всегда копируют целые строки, а не их части. Для этого вам нужно :substituteи использовать побочные эффекты в выражении замены, чтобы собрать их в регистр. Это объясняется на странице Копировать результаты поиска в буфер обмена Vim Tips Wiki.

С моим плагином ExtractMatches это довольно легко сделать:

:3,$YankMatchesToReg#/\zs.*\ze'#
:1put

Это использует /.*' шаблон и ограничивает совпадение (с \zs а также \ze атомы), чтобы исключить косую черту и конечную кавычку.

Без плагина, вероятно, проще скопировать все строки, а затем удалить нежелательный контент с помощью :s, как показано в ответе @pandubear.

Другие вопросы по тегам