我正在尝试在一个大型 JavaScript 项目上自动执行一些文本操作,并希望使用 vimgrep
跳转到匹配项,我将在后面调用各种宏。
我的目标行是这样的:
getText("foo", 1)
但是,不是这样的:
getText("foo")
getText("foo", [1])
我只想匹配具有多个参数且未包含在数组中的 getText
用法。
此搜索查询 (/) 使用否定的前瞻性,似乎有效:
getText(.*",\(.*[\)\@!
但是,用 vimgrep
运行这个正则表达式:
:vimgrep /getText(.*",\(.*[\)\@!/ project/src/**/*.js
...失败并显示此消息:
E682: Invalid search pattern or delimiter
我怀疑我的正则表达式的前瞻部分是原因,因为当我删除它时错误消失了。
有没有办法通过 vimgrep
使用环视断言?
最佳答案
:vimgrep
将每个搜索到的文件加载到 Vim 缓冲区中,然后对它应用 Vim 的正则表达式搜索。因此,与 'grepprg'
/:grep
等外部工具不同,您可以在此处使用完整的 Vim 正则表达式语法。
正如@Matt 已经评论过的,E682
是由于未能转义[
引起的。当您在常规 /
搜索中使用表达式时,Vim 只是将 [
视为文字字符,作为 collection未正确关闭 - 您的搜索按预期工作。
在:vimgrep
,但是 {pattern}
必须用 /.../
定界符括起来。显然,解析器继续寻找结尾的 /
,但找不到它,因为尚未关闭的 [
集合一直在消耗字符,这导致了错误。这种不一致并不好,它显然让你绊倒了,但它不一定是错的。现在你知道了:-)
只需将 [
字符正确转义为 \[
,它就会起作用:
:vimgrep /getText(.*",\(.*\[\)\@!/ project/src/**/*.js
有特殊的正则表达式原子(\v
和\V
)改变转义的数量;有些人喜欢使用它们(以避免过度转义,或为了更好的可读性)——我主要发现解释中的必要转变会分散注意力。
关于vim - vimgrep 可以与环视断言一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58986971/