Vim - дергать в регистр поиска - PullRequest
72 голосов
/ 22 февраля 2010

Есть ли какой-нибудь простой / быстрый способ "вставить" в регистр "последнего поиска" vim ("/)?

Из документации vim видно, что ответ отрицательный, но его можно назначить с помощью команды let:

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

В идеале я хотел бы сделать что-то вроде:

"/5yw

, который выдернет следующие 5 слов под курсором и поместит их в последний буфер поиска

В качестве альтернативы, если есть способ поиска содержимого именованного регистра, это тоже будет работать. Другими словами, если бы я мог сделать:

"A5yw

, а затем найдите, что находится в регистре А, это тоже сработает.

Самое близкое, что я могу получить, - это нажать на именованный регистр, а затем скопировать этот регистр в последний регистр поиска, например,

"A5yw
:let @/=@A

Риск сделать длинный вопрос длиннее. Я хочу заявить, что это не всегда 5 слов, которые я хотел бы "дергать и искать" - иногда это 17 символов, иногда до конца строки и т. Д. ... так что жестко запрограммированный макрос не дает мне гибкости, которую я хотел бы.

Ответы [ 5 ]

97 голосов
/ 22 февраля 2010

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

например.

  • Сначала "Ayw чтобы вставить слово в регистр A
  • Затем / ^R A поместить содержимое регистра A в строку поиска.
30 голосов
/ 03 сентября 2013

Если вы не использовали какой-либо регистр для хранения дерганного текста, vim использует регистр 0. Вы можете найти это, набрав Ctrl-R 0 после /.

Более сложный пример. Скажем, вы хотите найти в другом буфере текст внутри кавычек, который находится под курсором прямо сейчас:

  • Вы можете сделать это с помощью yi" (yank внутренняя кавычка)
  • Перейдите в буфер, где вы хотите искать
  • Тип /Ctrl-R 0
9 голосов
/ 24 февраля 2010

Для этого я использую следующий код:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction
5 голосов
/ 22 февраля 2010

Так что в основном расширенная версия команд # и *, верно? Похоже, вы хотите определить пользовательский оператор (команда, которая ожидает движения). Я никогда не делал этого на самом деле, но я нашел плагин , который выглядит так, как будто это может сделать это проще. Приведено несколько примеров.

4 голосов
/ 02 июня 2015

Поиск по выбору:

Если вы хотите сначала восстановить участок строки, затем использовать «v» и перемещаться курсорами, пока вы не отметите то, что вы хотите, затем нажмите y для перехода назад, и теперь выбор находится в регистре 0

затем вы можете набрать /Ctrl-R 0

...