不移动光标的情况下搜索光标下的单词

27

当我使用 g**g# 时,它会触发对光标下单词的搜索。然而,光标会移动到该单词的下一个/上一个出现位置。有没有一种方法可以在不使光标移动的情况下搜索当前单词?

这很烦人,因为我经常想按以下步骤操作:

  1. *
  2. :.,+5s/foo/bar/g

但是这个问题迫使我要做以下步骤:

  1. *
  2. 然后 Shift + * (我想跳过这一步)
  3. 进行查找和替换。

我看不出第一步和第二步之间的联系。 - romainl
6个回答

33

有没有一种方法可以在不移动光标的情况下搜索当前单词?

通配符*#等命令的整个意义在文档中已经非常清晰了:“向前搜索”或“向后搜索”。你的问题似乎是你不是为了它们的预期目的而使用这些命令,而是为了一个副作用,可能是突出显示光标下单词的所有出现。

由于没有内置的命令,因此您需要自己进行映射:

nnoremap <key> *``
nnoremap <anotherkey> #``
...

谢谢,我相信你回答了我的问题。虽然没有内置函数可以实现这个功能,但是它可以映射到我的 .vimrc 文件中。 - Oskar Granlund
1
为保持跳转,请使用 m:keepjumps normal! *``´,请注意,gstar 也适用于无单词边界搜索。 - Jay-Pi
有趣的是,在另一个窗口中搜索不起作用,需要设置 / 寄存器:<cmd>let @/='\<'.expand("<cword>").'\>'<Bar>wincmd w<Bar>normal n<CR><cmd>wincmd w<CR>。请注意,vimscript 不喜欢长命令链。 - Jay-Pi

6

不必按下*来填充搜索模式,而是直接使用CTRL-R CTRL-W将单词复制到命令行中。即:

:.,+5s/<C-R><C-W>/bar/g

这非常适合我所需的...使用:g/<ctrl-r><ctrl-w>/p查找并跳转到我想要的单词的实例。 - Pete
不错的技巧。但你知道什么更酷吗?nnoremap <leader># :let @/ = '<'.expand('<cword>').'>'<C-M> nnoremap <leader>sh :set hlsearch!<CR> - Jay-Pi
你在文档中怎么找到这样的东西啊 翻白眼。谢谢!有没有类似的按键组合可以搜索多个单词/短语? - MacMartin
@MacMartin vim 是我使用了约 25 年的主要工具之一。 我曾经完全阅读过它的文档,不止一次。自那时以来,我定期重新审视文档(尤其是当新的主要版本发布时),以发现新的技巧和功能。 :-) - phd

4

您可以进行映射:

nnoremap # #N
nnoremap * *N

简单而高效的解决方案。 - Allen Zheng

3
我使用以下映射来搜索当前单词并保留光标位置:
nnoremap <expr> * ':%s/'.expand('<cword>').'//gn<CR>``'

额外的好处是我们也得到了匹配数。

2
更改* / # / g*等的功能,以使其不跳转(特别是没有给定的[count]),这是一个经常被要求的功能。因此,大量插件会更改Vim的默认行为,通常与其他搜索相关命令一起使用。我的SearchHighlighting 插件就是其中之一。(插件页面有许多可供尝试的替代插件链接。)
@romainl 的答案是一个最小化的解决方案,但也存在一些缺点(例如屏幕闪烁,可能改变窗口视口),而大多数插件都会避免这些问题。

0
noremap * :let @/ = "\\<<C-r><C-w>\\>"<cr>:set hlsearch<cr>

它只是将搜索模式设置为光标下的整个单词,然后触发搜索高亮的更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接