Как сделать инкрементальный поиск в Vim, как это делается в Emacs?

При использовании инкрементного поиска в vim курсор немедленно переходит к следующему вхождению поискового термина, насколько вы его набрали. Emacs имеет аналогичную инкрементную функцию поиска. Тем не менее, есть функция emacs isearch, которую я нашел очень полезной, что я действительно хотел бы в vim. В emacs, если вы наберете:

<ctrl-s>word

он сразу переходит к "слову", точно так же, как vim инкрементный поиск. В emacs теперь вы можете ввести дополнительный <ctrl-s>, чтобы перейти к следующему результату появления слова "word", а в emacs это не закончит ваш инкрементный сеанс поиска. Чтобы сделать то же самое в vim, вы должны нажать <cr>, чтобы закончить поисковый запрос, а затем нажмите n, чтобы перейти к следующему результату поиска. Поскольку emacs не завершает сеанс поиска, вы можете делать такие вещи, как:

<ctrl-s>word<ctrl-s><ctrl-s>more

Это позволяет вам "поселиться" в вашем поиске, как только вы приблизитесь к тому месту, куда вы хотите пойти, и окажется невероятно полезным!

Есть ли способ заставить vim сделать то же самое?

Ответ 1

Последние версии Vim предоставляют встроенные сопоставления режима командной строки, чтобы сделать именно то, что вы хотите.

Вы можете найти это в help:

CTRL-G

Когда 'incsearch' установлен, введите шаблон поиска для "/" или                 "?" и отображается текущее совпадение, тогда CTRL-G переместится на следующее совпадение (не учитывает смещение по поиску). Используйте CTRL-T для перехода к предыдущему совпадению. Подсказка: на обычной клавиатуре T выше G.

Номера исправлений для ссылок, поскольку не все установки имеют сопоставления:

  • Патч 7.4.2259, сделанный Ctrl-N/Ctrl-P, действует как Ctrl-S/Ctrl-R в Emacs.

  • Патч 7.4.2268 изменил отображения на CTRL-G/CTRL-T (те, которые первоначально использовались для разных целей).

Ответ 2

Два приведенных ниже отображения позволяют мне нажать <Tab> или <S-Tab>, чтобы перейти к следующему или предыдущему совпадению, не выходя из инкрементного поиска:

" needed for mapping <Tab> in command-line mode
set wildcharm=<C-z>

cnoremap <expr> <Tab>   getcmdtype() == "/" \|\| getcmdtype() == "?" ? "<CR>/<C-r>/" : "<C-z>"
cnoremap <expr> <S-Tab> getcmdtype() == "/" \|\| getcmdtype() == "?" ? "<CR>?<C-r>/" : "<S-Tab>"

Ответ 3

Вы можете использовать отображение клавиш:

nnoremap <C-s> /<Up>

(для нормального режима)

Если вы хотите оставить предыдущий матч (не переходить к следующему совпадению), вы можете просто вернуться к предыдущему совпадению после /<Up>:

nnoremap <C-s> N/<Up>

Использование:

  • /word<CR> - начните поиск word
  • n,..., n - перейти к следующим совпадениям
  • <C-s>, т.е. Control + s - вызов предыдущего поиска (1)
  • Введите more - начните поиск /wordmore

Ответ 4

С той же идеей:

:cnoremap <c-s> <cr>/<up>

При таком отображении использование Ctrl-L во время поиска еще более полезно.