如何像在Emacs中一样在Vim中进行增量搜索?
在vim中使用增量搜索时,光标会立即转到您键入的下一个搜索词。Emacs具有类似的增量搜索功能。然而,我发现emacs isearch的一个特性非常有用,这是我非常希望在vim中使用的。在emacs中,如果键入:如何像在Emacs中一样在Vim中进行增量搜索?,vim,incremental-search,Vim,Incremental Search,在vim中使用增量搜索时,光标会立即转到您键入的下一个搜索词。Emacs具有类似的增量搜索功能。然而,我发现emacs isearch的一个特性非常有用,这是我非常希望在vim中使用的。在emacs中,如果键入: word 它会立即转到“word”,就像vim增量搜索一样。在emacs中,您现在可以键入额外的移动到“word”的下一个结果出现处,而在emacs中,这不会结束增量搜索会话。要在vim中执行相同操作,必须点击,以结束搜索项,然后点击n以转到下一个搜索结果。由于emacs不会结束搜索会
word
它会立即转到“word”,就像vim增量搜索一样。在emacs中,您现在可以键入额外的
移动到“word”的下一个结果出现处,而在emacs中,这不会结束增量搜索会话。要在vim中执行相同操作,必须点击
,以结束搜索项,然后点击n
以转到下一个搜索结果。由于emacs不会结束搜索会话,因此可以执行以下操作:
wordmore
一旦你更接近你想去的地方,这会让你在搜索中“回家”,结果证明这是非常有用的
有没有办法让vim也这样做?您可以使用键映射:
nnoremap <C-s> /<Up>
nnoremap/
(对于正常模式)
如果您想保持上一场比赛的状态(而不是移动到下一场比赛),您可以在/
之后返回上一场比赛:
nnoremap N/
用法:
/word
-开始搜索word
n
,…,n
-移动到下一个匹配项
,即控件+s
-调用上一次搜索(1)more
-开始搜索/wordmore
:cnoremap <c-s> <cr>/<up>
:cnoremap/
使用此映射,在搜索过程中使用Ctrl-L更为有用。下面的两个映射允许我点击
或
跳转到下一个或上一个匹配,而不离开增量搜索:
" 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 getcmdtype()
cnoremap getcmdtype()
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(最初使用的映射有不同的用途)
/word
,2)
,3)n
,…,n
,4)//code>,5,
?您将返回到搜索命令,即/word
。然后您可以继续输入更多的。是的,这很有效(大致就是我现在所做的),只是它不如emacs版本方便。Vim应该在任何时候都比emacs更方便!;-)当然,最难的部分是点击
,您可以使用/
插入包含以前搜索项的搜索寄存器。“/”-启动搜索“Ctrl-l”-使用光标后的字符(类似于emacs中的“Ctrl-w”)我也尝试添加了:cnoremap n/
,这样我就可以在不退出搜索的情况下点击ctrl-s
进入下一场比赛,但一次会跳转两个结果。你知道如何避免吗?@00prometheus,nnoremap n/
?@yolenoyer找到了答案;看看他的答案!@00prometheus,his解决方案对我不起作用。但我的映射工作原理与问题中描述的一样。奇怪的是,它对我起作用。我现在在.vimrc中使用nnoremap/
和cnoremap/
,它工作得很好!现在我只需要找到一个用于反向isearch的免费键!:-)我也尝试过,但当我这样做时,搜索跳了两步每次结果。您是否得到不同的结果?如果您将@Ruslans的映射更改为nnoremap/
,那么它似乎也能工作!getcmdtype条件映射与普通键映射相比有什么优势?这比我习惯的更深入到vim中:-)现在,我有nnoremap/
cnoremap/
cnoremap?
,在my.vimrc中。它允许我使用ctrl-s前进,ctrl-z后退。@00prometheus:这是对xaizek对旧版本Vim的回答的一个很好的模拟。如果在第一个
之后添加zv
,它也会在需要时打开折叠。例如cnoremap getcmdtype()==“/”\ \124; \\ 124; getcmdtype()==“?”?“zv/”:““
我升级了vim,这很有效!然而,yolenoyer和Ruslan的键映射实际上更好:它们让我继续旧的搜索!Ctrl-T/Ctrl-G不允许我附加到上一次搜索,这是我想要的核心。@00prometheus你说不能附加到上一次搜索是什么意思?模式对我来说保持不变,我可以继续编辑它。对不起,我现在知道了!只需进行搜索,点击/
,然后输入更多内容到主页,而无需离开搜索。完美的
" 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>"