Як шукати рядки, що відповідають поточному рядку в vim


11

Я зазвичай шукаю слова за допомогою :/string, але якщо мені доведеться шукати весь поточний рядок, як це зробити.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Наприклад, якщо cursorв даний час line 1потрібно шукати аналогічно :/тексту, що містить весь поточний рядок. Курсор повинен перейти до відповідності line 4та знову доline 7

Відповіді:


7

Ось як я це зробив:

  1. Додайте рядок (до реєстру без назви), не включаючи новий рядок в кінці: 0y$
  2. Розпочніть дуже номагічний пошук:/\V
  3. Додати рядок: <c-r>"
  4. Вимкніть пошук: <cr>

Як в коментарі вказує @EvergreenTree , ви, звичайно, можете створити відображення для виконання всіх кроків за один раз:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Відповідні теми довідки:

:help registers
:help /magic
:help c_CTRL-R

Примітка: Якщо рядок, який ви шукаєте, містить зворотні риски, вам все одно доведеться пройти їх та уникнути їх (додавши ще один зворотний ривок ), навіть при дуже номагічному пошуку.


4
Звичайно, ви також можете створити карту для цього: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

Особливо для цілей картографування я вважаю, що використовувати getline()більш елегантно, ніж займатися янькою самостійно. Виклик getline()за допомогою рядка '.'повертає рядок під курсором. Є два хороших варіанти використання цього:

:exec '/' . getline('.')

який аналізує рядки '/'і повертається getline()разом і виконує це як команду vim.

або

/<C-r>=getline('.')<CR>

який використовує регістр виразів @=. Наступний вираз =оцінюється після першого <CR>і розміщується в командному рядку.


Приємно! Коли рядок містить символи на кшталт /або 'він працює не дуже добре. У всякому разі, я сьогодні щось дізнаюся! Дякую
Люк М

4

Особисто я отримав би візуальний плагін зірки ( їх небагато ). З цього приводу є приємний Vimcast: пошук вибраного тексту . Це означає, що ви можете вибрати лінію візуально, а потім натиснути *.

Якщо плагін - це не ваша річ, ви можете додати до свого відображення таке відображення vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Примітка: Visual-block ( <c-v>) не підтримується для цього відображення.


Я додав відображення, але насправді це перехід до першого відповідного слова і НЕ вибору всього рядка.
манав мн

Якщо це збігається зі словом, тоді я припускаю, що ви використовуєте *у звичайному режимі чи не встановлено відображення правильно.
Пітер Рінкер

4

Усі існуючі відповіді не відповідають вимогам, якщо ваш рядок містить певні елементи, які інтерпретуються як частина шаблону. Справа \Vпроходить більшу частину шляху там, але все ще псується з косою рисою.

Спробуйте це, щоб уникнути накипу ...

/\V<C-R>=escape(getline('.'), '\')

І тоді, якщо ви використовуєте його для картографування, вам знадобиться один або два <Enter>с наприкінці, залежно від того, як ви хочете, щоб воно працювало.


Відмінна відповідь! Рядки часто містять обидва види косої риси, які плутають інші відповіді. Цей останній аргумент про втечу повинен містити також пряму косу escape(…, '/\')
рису

2

При встановленому vim-asterisk просто використовуйте V$*(або 0v$*) для вибору поточного рядка та пошуку його.

У другій команді 0немає необхідності, якщо курсор вже на початку рядка.


1
Ви *шукаєте не лише слово під курсором, а не поточний візуальний вибір?
EvergreenTree

1
@EvergreenTree Я забув згадати плагін. Дякую за повідомлення
adelarsq

2

Ще один спосіб зробити це за допомогою вікна командного рядка: yy/<Ctrl-F>p<Enter>

  • Зберіть цілу лінію, яка вам потрібна yy
  • Натисніть, /а потім Ctrl-F, щоб відкрити вікно командного рядка
  • Натисніть, pщоб вставити рядок
  • Натисніть Enter, щоб розпочати пошук

5
Ви також можете використовувати q/такий же ефект, як/<c-f>
evilsoup

2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes вказує, що реєстр пошуку можна встановити безпосередньо, як це:

:let @/='/abc/def/ghi/'

Це дозволяє здійснювати пошук у рядку і працює, навіть якщо рядок включає косої риски.

Отже, щоб зробити, скажімо, \*карту на пошук рядків:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.