如何使用ag的-G选项指定文件夹搜索?正则匹配问题求助
解决ag路径匹配与Vim便捷搜索问题
我来帮你搞定这两个问题,先从ag的正则匹配说起,再讲Vim里怎么实现Atom那种顺手的路径搜索~
一、修复ag的-G正则不生效问题
你用ag -G routes会命中所有路径含"routes"的文件,这是因为-G的正则是匹配路径的任意部分,比如app/routes/file.php或vendor/routes/utils.php都会被匹配到。
而你尝试-G ^routes没生效,核心原因是ag的路径匹配是基于当前工作目录的完整相对路径:
- 如果文件在根目录的
routes/下,路径是routes/index.php,^routes能匹配; - 但如果文件在子目录比如
app/routes/下,路径是app/routes/api.php,^routes就不会匹配(因为路径开头是app)。
根据你的需求,给你两个实用的正则写法:
- 若要匹配所有层级下名为routes的文件夹:
这个正则会匹配路径中包含ag "你的搜索关键词" -G '/routes/'/routes/的文件,不管它在哪个层级。 - 若要匹配根目录下的routes文件夹:
ag "你的搜索关键词" -G '^routes/'
二、在Vim里实现Atom式多文件夹+排除搜索
Atom的app,routes,!storage语法确实省心,在Vim里用ag也能轻松复刻,分两种场景:
1. 无需插件:直接执行shell命令
在Vim里直接敲下面的命令,就能在app/和routes/搜索,同时排除storage/目录:
:!ag "你的搜索关键词" app/ routes/ --ignore-dir storage
2. 用vim-ag插件(更高效的Vim内搜索)
如果你装了vim-ag插件(很多Vim用户必备),可以用:Ag命令直接在Vim内调用ag,结果会显示在quickfix窗口,回车就能跳转:
:Ag "你的搜索关键词" app routes --ignore-dir storage
要是你想更贴近Atom的语法,还可以在~/.vimrc里自定义一个命令:
command! -nargs=+ AgDirs call system('ag ' . shellescape(<q-args>) . ' | cgetexpr')
之后就能用类似的写法(把逗号换成空格,!换成--ignore-dir):
:AgDirs "你的搜索关键词" app routes --ignore-dir storage
小提示:其实ag本身支持直接指定多个搜索目录,配合--ignore-dir排除目录,比硬套正则更直观,没必要纠结用-G实现哦~
内容的提问来源于stack exchange,提问作者Jesse Leite
相关产品推荐
相关产品推荐

