Vim: yank Regex соответствует + буфер обмена - PullRequest
8 голосов
/ 14 декабря 2011

Пример :%y+ восстанавливает внешний + буфер обмена.Теперь я хочу получить результаты по регулярным выражениям, таким как ^\S\+ для внешнего + буфера обмена.Как?

Пробная версия 1. [Fail] :g@^\S\+@y+

Пробная версия 2. [Fail] :^\S\+y+

Ответы [ 4 ]

6 голосов
/ 14 декабря 2011

Посмотрите здесь http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard, раздел «Копирование строк, содержащих результаты поиска».

Это сработало для меня (очистить регистр a, yank pattern результаты в него, скопировать в буфер обмена):

qaq
:g/pattern/y A
:let @+ = @a

Когда я пытался :g/pattern/y+, он копировал только первую строку.

В этом разделе ссылки также есть функция, которую вы можете написать для копирования всех строк, но она все равно выглядит как двухэтапный процесс (выполните /pattern и затем вызовите функцию): но вы, вероятно, могли бы написать свой собственный макрос / ярлык, чтобы сделать оба в последовательности.

2 голосов
/ 14 декабря 2011

Возможно, вы можете найти вдохновение в следующем:

:saveas %.tmp

чтобы начать работать с копией

:v//d
:exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g'

Так, например, выполнить поиск /word\d по следующему тексту:

Tincidunt. Проин Сагиттис2 . Curabitur auctor metus non mauris. Nunc condimentum Нисл не Ауге. Donec leo urna, dignissim vitae, porttitor ut, iaculis sit амет, сем.

Class aptent taciti sociosqu3 ad litora torquent per conubia nostra, за inceptos himenaeos. Потенциал Suspendisse. Quisque augue metus, хендрерит сидеть Amet, Commodo Vel, Scelerisque UT, Ante. Престижный Евизмод. Mauris Ут Метус сит амет ми курсос коммодо. Morbi congue mauris ac sapien. Донец Justo. Sed congue nunc vel mauris0 . Pellentesque vehicleula orci id libero. В хаке привычная тарелка. Nulla sollicitudin, purus1 id elementum dictum, dolor augue hendrerit ante, vel semper metus enim et dolor. Pellentesque molestie9 .

выделит слова, как показано. Делая

:v//d|exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g'

приводит к следующему буферу:

sagittis2
sociosqu3
mauris0
purus1
molestie9
1 голос
/ 26 декабря 2011

добавить все результаты поиска к reg X (заглавные буквы), разделенные новой строкой:

:g/^/call setreg('X', matchstr(getline('.'), '^\S\+') . "\n")

очистить reg x:

qxq
1 голос
/ 14 декабря 2011

Попробуйте следующее.Сначала определите функцию для сохранения ваших соответствующих регулярных выражений в список (: help List).

:fun Add(list, item)
:   call add(a:list, a:item)
:   return a:item
:endfun

Обратите внимание, что он также возвращает добавленный элемент.В этом нет необходимости, но то, что вы возвращаете здесь, становится текстом замены в: замене, который следует ниже.

Затем создайте пустой список.

:let list=[]

Затем запустите регулярное выражение.

:%s/^\S\+/\=Add(list, submatch(0))/

Обратите внимание, что замена начинается с \ = (см .: help sub-replace-special).В результате мы заменяем выражение соответствия на себя, но в то же время записываем результат в список.

Функция submatch () возвращает совпадающие части команды: substitute.submatch (0) возвращает полное совпадение.

Обратите внимание, что в качестве побочного эффекта буфер помечается как измененный.Если вы сохранили буфер перед выполнением подстановки, вы можете исправить это, просто нажав u для отмены или добавив '|ты в твоем распоряжении.(Если вы собираетесь отменить операцию, то не имеет значения, что мы возвращаем из нашей функции Add.)

Вы можете просмотреть свои совпадения с помощью

:echo list

или добавить их.в ваш буфер с

:$put=list

Надеюсь, это поможет.Это просто, если вы знаете, как это сделать, но там многое можно переварить.

О, я почти забыл!Вы можете добавить свои совпадения в буфер обмена с помощью

:let @+ = join(list, '^@')

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

^ @ представляет символ NUL и генерируется с помощью, то есть нажмите control-V, а затем control-J.(Почему вы должны использовать ^ @, это целая тема сама по себе.)

...