Как сделать инкрементальный поиск в 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 сделать то же самое?

4 ответа

Решение

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

Вы можете найти это в справке:

CTRL-G

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

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

  • Патч 7.4.2259 заставил Ctrl-N/Ctrl-P действовать в Emacs как Ctrl-S/Ctrl-R.

  • Патч 7.4.2268 изменил сопоставления на Ctrl-G/Ctrl-T (те, которые изначально использовались, имеют другое назначение).

Два приведенных ниже сопоставления позволяют мне ударить <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>"

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

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

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

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

nnoremap <C-s> /<Up>

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

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

nnoremap <C-s> N/<Up>

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

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