Копирование шаблона из набора линий в режиме 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:
: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.