Vim - вставить в поисковый регистр


81

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

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

Ответы:


110

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

например.

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

1
Это, конечно, работает, но похоже, что OP, возможно, на самом деле не хочет искать, просто выделите. В таком случае лучше всего подойдет специальный оператор.
Cascabel

1
Супер - спасибо, ар ... это именно то, что мне было нужно (ну, с учетом того, что идеальное решение вообще невозможно.) Спасибо за краткое решение.
Дэн

11
Просто комментарий ... "Ayw не вставляет слово в регистр" A ".... он добавляет объект, который был вставлен в регистр" a ".
jkerian

1
+1 давно искал это, идеальное решение проблемы, которую я пытался решить - спасибо.
iblamefish 05

8
Для ясности - vim использует регистр регистра, чтобы определить, добавляет ли он содержимое или заменяет его, поэтому "ayw(нижний регистр) заменит содержимое регистра 'a', а "Aywдобавит в регистр 'a'
Питер Гибсон

40

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

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

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

1
Я нашел это решение более полезным, чем a'r, поскольку многократное выполнение "Ayw приводит к добавлению строки в регистре A. Но простой набор, ywа затем ввод Ctrl-R 0после /всегда дает именно то, что я выдернул.
Дэвид Юнг

10

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

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

Если это неясно, это позволяет вам выбрать текст в визуальном режиме и использовать * или # для поиска этого текста.
Эдвард Андерсон

6

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

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

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


5

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.