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.