Vim - загляните в регистр поиска

Есть ли простой/быстрый способ "выдернуть" в регистр "последний поиск" 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

а затем выполните поиск того, что находится в регистре A, и это будет работать.

Ближайшим, к которому я могу прийти, является вытащить в именованный регистр и затем скопировать этот регистр в последний регистр поиска, например.

"A5yw
:let @/[email protected]

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

Ответ 1

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

например.

  • Во-первых, "Ayw, чтобы вырвать слово в регистр A
  • Затем / ^R A помещает содержимое регистра A в строку поиска.

Ответ 2

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

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

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

Ответ 3

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

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

    function! VisualSearch(dirrection)
        let l:[email protected]@
        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

Ответ 4

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

Ответ 5

Поиск выбора:

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

вы можете ввести /Ctrl-R 0