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

а потім шукати те, що є в реєстрі А, це теж спрацювало б.

Найближче, до чого я можу підійти, - це втягнутись до іменованого реєстру, а потім скопіювати цей реєстр до останнього реєстру пошуку, наприклад

"A5yw
:let @/=@A

Ризикуючи затягнути довге запитання, я хочу сказати, що не завжди я б хотів 5 слів "витягати і шукати" - іноді це 17 символів, іноді це до кінця рядка тощо ... тому жорстко закодований макрос не дає мені тієї гнучкості, яку я хотів би.

Відповіді:


110

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

напр.

  • По-перше, "Ayw втягнути слово в регістр A
  • Потім, / ^R A щоб помістити вміст реєстру А в рядок пошуку.

1
Це, звичайно, працює, але схоже на те, що ОП насправді не хоче шукати, просто отримайте підсвічування. Якщо це так, спеціальним оператором буде правильний шлях.
— Cascabel

1
Супер - спасибі ... це саме те, що мені було потрібно (ну, зважаючи на обмеження, що ідеальне рішення насправді неможливе насамперед.) Дякую за стисле рішення.
— Dan

11
Просто коментар ... "Айв не втягує це слово в реєстр" А ".... воно додає те, що
— витягнуто до

1
+1 якийсь час шукав це, ідеальне рішення проблеми, яку я намагався вирішити - дякую.
— iblamefish

8
Для наочності - vim використовує регістр реєстру, щоб визначити, додається він чи замінює вміст, тому "ayw(мала літера) замінить вміст реєстру "a", тоді як "Aywдодасться до реєстру "a"
— Пітер Гібсон

40

Якщо ви не використовували жодного реєстру для зберігання вирваного тексту, vim використовує 0register. Ви можете шукати це, набравши Ctrl-R 0після /.

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

  • Ви можете зробити це за допомогою yi"(yank внутрішня цитата)
  • Перейдіть до буфера, де ви хочете здійснити пошук
  • Тип /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 для yank і тепер виділення буде зареєстровано 0

потім можна набирати текст /Ctrl-R 0


5

Отже, в основному розширена версія команд # і *, так? Здається, ви хочете визначити спеціальний оператор (команду, яка очікує руху). Я насправді ніколи цього не робив, але знайшов плагін, який, схоже, може спростити це. Наведено кілька прикладів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.