在VIM中使用Visual Select进行搜索?

6

我想要

  • 在可视模式下选择一个单词
  • 按下一个键来搜索所选单词

按照选择的顺序搜索单词,作为一个句子或任何选择的单词?即选择“the foo was named bar”并使用它进行搜索,只会找到相同的句子,而不是包含“the/foo/was/named/bar”的句子? - timss
@timss:是的,搜索确切选定的内容; - songyy
5个回答

13

这在vim中搜索选定内容已经有解释了。

  1. 使用可视选择模式,例如v
  2. 复制所选文本,y
  3. 搜索,/
  4. 使用<C-r>0 (Ctrlr+0)粘贴最后一次复制的文本。
    实际上是从寄存器0中插入内容,参见:h i_ctrl-r(感谢romainl评论中提供的信息)

另一个例子是使用命令行:

  1. 使用可视选择模式,例如v
  2. 复制所选文本,y
  3. 进入命令行模式并编辑Ex命令,q/
  4. 粘贴复制的文本,p,然后按Enter键进行搜索

简而言之:yq/p<Enter>


我似乎找不到 Ctrl-r 0 到底是什么意思,除了它可以粘贴最后一次复制的文本。:h Ctrl-r 告诉我这与 redo 相关,但这是正确的吗?能否有人解释一下这是如何工作的,或者如果它与 redo 无关的话,可能将我指向正确的帮助部分? - timss
3
在插入模式下,使用<C-r>0来插入寄存器0的内容。您也可以插入表达式的结果: <C-r>=2+57 < CR><C-r>=expand('%')等。请参阅:h i_ctrl-r。注意,i_表示插入模式命令。 - romainl

4

嘿,伙计,你可以使用由《实用Vim》作者发起的强大可视化搜索。它非常轻巧!

只需将以下内容添加到您的vimrc文件中,即可使用:

xnoremap * :<C-u>call <SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call <SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>

function! s:VSetSearch()
    let temp = @s
    norm! gv"sy
    let @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n','g')
    let @s = temp
endfunction

选择你想要搜索的内容,然后按星号*,完成!


3
百锐/大虎的SearchParty有几个巧妙的映射,建立在“拷贝和插入”的基础上,但能干净地处理换行等问题。
* Searches for the next occurrence of the currently selected visual text.

# Searches for the prior occurrence of the currently selected visual text.

& Starts a :substitute using the currently selected visual text. 

如果你觉得插件过于庞大,那么将脚本中相关的一行代码拿出来放入你的~/.vimrc文件中就很容易了。


1

要同时搜索多个单词,vim搜索支持使用或操作符'\|'。因此,要搜索dog、cat和bird,您可以执行以下操作:

/dog\|cat\|bird

或更好(精确匹配):
/\<dog\>\|\<cat\>\|\<bird\>

1
不确定为什么@romainl的回复没有得到更多赞同。它更快,自动转义可能会破坏搜索的字符,并且是原始的vim。结合cgn后跟.,它是那些在vscode中怀念Ctrl-d的完美替代品。

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