12

在 vim 中使用增量搜索时,只要您键入,光标就会立即转到搜索词的下一个匹配项。Emacs 也有类似的增量搜索功能。但是,我发现 emacs isearch 有一个非常有用的功能,我真的很想在 vim 中使用它。在 emacs 中,如果您键入:

<ctrl-s>word

它立即转到“word”,就像 vim 增量搜索一样。在 emacs 中,您现在可以键入 additional<ctrl-s>以移动到“单词”的下一个结果出现,并且在 emacs中,这不会结束您的增量搜索会话。要在 vim 中做同样的事情,您必须点击<cr>, 结束搜索词,然后点击n转到下一个搜索结果。由于 emacs 不会结束搜索会话,因此您可以执行以下操作:

<ctrl-s>word<ctrl-s><ctrl-s>more

一旦您靠近您想去的地方,这让您在搜索中“回家”,结果证明它非常有用!

有没有办法让 vim 做同样的事情?

4

4 回答 4

16

最新版本的 Vim 提供了命令行模式的内置映射来完全按照您的意愿行事。

你可以在帮助中找到这个:

CTRL-G

设置时'incsearch',输入"/"or 的搜索模式"?"并显示当前匹配然后CTRL-G将移动到下一个匹配(不考虑搜索偏移)。用于CTRL-T移动到上一场比赛。提示:在普通键盘T上是上面的G

补丁号供参考,因为并非所有安装都有映射:

  • 补丁 7.4.2259在 Emacs 中制作Ctrl-N/Ctrl-P行为类似Ctrl-S/ 。Ctrl-R

  • 补丁 7.4.2268 将映射更改为Ctrl-G/ Ctrl-T(最初使用的映射具有不同的用途)。

于 2016-10-22T17:00:46.167 回答
6

下面的两个映射让我可以在不离开增量搜索的情况下点击<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>"
于 2016-10-22T15:19:36.117 回答
1

您可以使用键映射:

nnoremap <C-s> /<Up>

(对于普通模式)

如果您想保留上一场比赛(而不是移动到下一场比赛),您可以在之后返回上一场比赛/<Up>

nnoremap <C-s> N/<Up>

用法:

  1. /word<CR>- 开始寻找word
  2. n, ..., n- 移动到下一场比赛
  3. <C-s>, ie Control + s- 调用之前的搜索 (1)
  4. 类型more- 开始搜索/wordmore
于 2016-10-22T13:54:08.513 回答
1

有同样的想法:

:cnoremap <c-s> <cr>/<up>

有了这个映射,他Ctrl-L在搜索过程中的使用就更加有用了。

于 2016-10-22T14:38:43.793 回答