如何像在 Emacs 中那样在 Vim 中进行增量搜索?
How to do incremenatal search in Vim like it is done in Emacs?
在 vim 中使用增量搜索时,光标会立即转到您键入的搜索词的下一个匹配项。 Emacs 也有类似的增量搜索功能。但是,我发现 emacs isearch 的一个功能非常有用,我真的很想要 vim。在 emacs 中,如果您键入:
<ctrl-s>word
它会立即转到 "word",就像 vim 增量搜索一样。在 emacs 中,您现在可以键入额外的 <ctrl-s>
以移动到 "word" 的下一个结果出现,而在 emacs 中 这不会结束您的增量搜索会话 。要在 vim 中执行相同操作,您必须按 <cr>
结束搜索词,然后按 n
转到下一个搜索结果。由于 emacs 不会结束搜索会话,您可以执行以下操作:
<ctrl-s>word<ctrl-s><ctrl-s>more
一旦你接近你想去的地方,这让你 "home in" 在你的搜索中,结果非常有用!
有没有办法让 vim 也这样做?
您可以使用键映射:
nnoremap <C-s> /<Up>
(普通模式)
如果你想留在上一场比赛(而不是移动到下一场比赛),你可以 return 到 /<Up>
之后的上一场比赛:
nnoremap <C-s> N/<Up>
用法:
/word<CR>
- 开始搜索 word
n
, ..., n
- 移动到下一场比赛
<C-s>
,即 Control + s
- 调用上一个搜索 (1)
- 键入
more
- 开始搜索 /wordmore
同样的想法:
:cnoremap <c-s> <cr>/<up>
有了这个映射,他在搜索过程中使用 Ctrl-L 就更有用了。
下面的两个映射让我可以点击 <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>"
Vim 的最新版本提供命令行模式的内置映射,以完全按照您的意愿执行操作。
您可以在 help 中找到它:
CTRL-G
When 'incsearch'
is set, entering a search pattern for "/"
or
"?"
and the current match is displayed then CTRL-G will move to the next match (does not take search-offset into account). Use CTRL-T to move to the previous match. Hint: on a regular keyboard T is above G.
供参考的补丁号,因为并非所有安装都有映射:
补丁 7.4.2259 使 Ctrl-N/Ctrl-P 的行为类似于 Ctrl -S/Ctrl-R 在 Emacs 中。
补丁 7.4.2268 将映射更改为 Ctrl-G/Ctrl-T(最初使用的映射有不同的目的)。
在 vim 中使用增量搜索时,光标会立即转到您键入的搜索词的下一个匹配项。 Emacs 也有类似的增量搜索功能。但是,我发现 emacs isearch 的一个功能非常有用,我真的很想要 vim。在 emacs 中,如果您键入:
<ctrl-s>word
它会立即转到 "word",就像 vim 增量搜索一样。在 emacs 中,您现在可以键入额外的 <ctrl-s>
以移动到 "word" 的下一个结果出现,而在 emacs 中 这不会结束您的增量搜索会话 。要在 vim 中执行相同操作,您必须按 <cr>
结束搜索词,然后按 n
转到下一个搜索结果。由于 emacs 不会结束搜索会话,您可以执行以下操作:
<ctrl-s>word<ctrl-s><ctrl-s>more
一旦你接近你想去的地方,这让你 "home in" 在你的搜索中,结果非常有用!
有没有办法让 vim 也这样做?
您可以使用键映射:
nnoremap <C-s> /<Up>
(普通模式)
如果你想留在上一场比赛(而不是移动到下一场比赛),你可以 return 到 /<Up>
之后的上一场比赛:
nnoremap <C-s> N/<Up>
用法:
/word<CR>
- 开始搜索word
n
, ...,n
- 移动到下一场比赛<C-s>
,即Control + s
- 调用上一个搜索 (1)- 键入
more
- 开始搜索/wordmore
同样的想法:
:cnoremap <c-s> <cr>/<up>
有了这个映射,他在搜索过程中使用 Ctrl-L 就更有用了。
下面的两个映射让我可以点击 <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>"
Vim 的最新版本提供命令行模式的内置映射,以完全按照您的意愿执行操作。
您可以在 help 中找到它:
CTRL-G
When
'incsearch'
is set, entering a search pattern for"/"
or"?"
and the current match is displayed then CTRL-G will move to the next match (does not take search-offset into account). Use CTRL-T to move to the previous match. Hint: on a regular keyboard T is above G.
供参考的补丁号,因为并非所有安装都有映射:
补丁 7.4.2259 使 Ctrl-N/Ctrl-P 的行为类似于 Ctrl -S/Ctrl-R 在 Emacs 中。
补丁 7.4.2268 将映射更改为 Ctrl-G/Ctrl-T(最初使用的映射有不同的目的)。