如何像在 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>

用法:

  1. /word<CR> - 开始搜索 word
  2. n, ..., n - 移动到下一场比赛
  3. <C-s>,即 Control + s - 调用上一个搜索 (1)
  4. 键入 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(最初使用的映射有不同的目的)。