Как искать строки, соответствующие текущей строке в 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. Инициировать очень nomagic поиска:/\V
  3. Добавьте выдернутую строку: <c-r>"
  4. Выстрелить из поиска: <cr>

Как указывает @EvergreenTree в комментарии , вы, конечно, можете создать отображение, чтобы выполнить все шаги за один раз:

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

Соответствующие разделы справки:

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

NB Если линия вы ищете содержит обратную косую черту, вы все равно должны пройти и избежать их (добавив еще один обратный слэш), даже с очень nomagic поиска.


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(…, '/\')
bobbogo

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.