Как сделать инкрементальный поиск в 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 во время поиска еще более полезно.