You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Vim中通过Ripgrep正确搜索竖线符号||?

在Vim中用Ripgrep的:Rg命令正确搜索||的方法

我最近在Vim里折腾用Ripgrep的:Rg命令搜索||这个符号组合,踩了好几个坑,试了一堆命令都不对:

  • :Rg --hidden --no-ignore '||'
  • :Rg --hidden --no-ignore '\|\|'
  • :Rg --hidden --no-ignore "||"
  • :Rg --hidden --no-ignore "\|\|"

结果这些命令全把每一行的每一列都匹配上了,完全不是我要找的||。后来翻了手册说可以用--fixed-strings参数来按固定字符串搜索,结果试的时候又报错,甚至手滑打了一串s也没用,错误提示是这样的:

1 || error: Found argument '--fixed-string' which wasn't expected, or isn't valid in this context
2 || Did you mean --fixed-strings?
3 ||
4 || USAGE:
5 ||
6 || rg [OPTIONS] PATTERN [PATH ...]
7 || rg [OPTIONS] [-e PATTERN ...] [-f PATTERNFILE ...] [PATH ...]
8 || rg [OPTIONS] --files [PATH ...]
9 || rg [OPTIONS] --type-list
10 || command | rg [OPTIONS] PATTERN
11 ||
12 || For more information try --help

后来才搞明白问题出在哪:

问题1:正则表达式的特殊含义

||在正则表达式里是逻辑或的语法,相当于匹配空字符串或者空字符串,所以会匹配每一个位置。如果不用固定字符串模式,你需要处理Vim和Ripgrep两层转义,这很容易搞混。

问题2:参数拼写错误

看错误提示里的--fixed-string(单数,少了最后一个s),说明你实际输入的是这个错误的参数名,而手册里的正确参数是复数形式的--fixed-strings(带末尾的s)。

正确的解决方法

最简单的就是用固定字符串模式,确保参数拼写正确:

:Rg --fixed-strings --hidden --no-ignore '||'

如果你不想用--fixed-strings,也可以用正则转义,但要注意Vim的转义规则——需要把|转义两次(一次给Vim,一次给Ripgrep),命令是:

:Rg --hidden --no-ignore "\\\\|\\\\|"

不过显然第一种方法更直观,不容易出错。

内容的提问来源于stack exchange,提问作者xxjjnn

火山引擎 最新活动