Как сделать инкрементальный поиск в 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>
Использование:
/word<CR>
- начать поискword
n
,...,n
- перейти к следующим матчам<C-s>
т.е.Control + s
- вызвать предыдущий поиск (1)- Тип
more
- начать поиск/wordmore