当我运行项目范围(多文件)搜索时自由落体,结果充斥着这样的行文件路径匹配查询,挤出更相关的结果,其中文件内容匹配。
例如,运行来自 Wiki 的 Ag 示例,
ag --nobreak --nonumbers --noheading . | fzf
我会查询search
并得到类似这样的结果,
plugin/keybindings.vim:cnoremap <expr> <C-Y> refract#if_incsearch("\<C-L>", "\<C-Y>")
plugin/keybindings.vim:cmap <C-P> <Plug>(refract_incsearch_prev)
plugin/coherent.vim:set incsearch
plugin/coherent.vim:setg tags+=./tags;~ " search for tags recursively upwards until ~
plugin/search.vim:" use it for tab-completion instead depending on context of cmdline
plugin/search.vim: autocmd User Hint,listical_next,listical_prev Latitude
plugin/search.vim: autocmd User Grepper call hint#prepare_highlights()
plugin/search.vim:let g:fzf_colors =
plugin/search.vim:" let g:grepper =
plugin/search.vim:\ <q-args>,
plugin/search.vim:\ <bang>0)
plugin/search.vim:augroup END
plugin/search.vim: autocmd!
plugin/search.vim:
plugin/search.vim:
plugin/search.vim:
plugin/search.vim:
> plugin/search.vim:
41/517
> search
我做错了什么?当我运行没有 FZF 的类似 Ag 查询时,我只能获得文件内容中出现查询的位置的结果(这正是我想要的)。
答案1
我误解了 ag 和 fzf 之间的交互,以为我输入的查询在通过管道传输到 fzf 之前以某种方式通过了 ag。回想起来,这是一个愚蠢的错误,因为过滤正是 fzf 所做的,而 ag 只是被用作生成大量有意义的行的方式。
为了得到我想要的东西,我查看了 ag 生成的行的格式,例如
plugin/coherent.vim:set incsearch
告诉 fzf 将其视为:
字段分隔符,并且应将其搜索范围限制为字段 2、3、4……
ag --nobreak --nonumbers --noheading . | fzf --delimiter=: --nth=2..
如果任何处理过的文件:
的文件名中包含 ,则此操作将会中断,但我不希望这种情况经常发生。
答案2
对于那些正在寻找 ripgrep 脚本的人来说,这是我想到的:
FZF_EDITOR="gvim"
# Fuzzy Ripgrep Ignoring-case
frgi() {
local result
IFS=$'\n' result="$(rg -i --line-number "$@" | fzf --no-sort --tac --delimiter=: --nth=2..)"
local filename
local lineno
local _
if [[ -n "$result" ]]
then
IFS=':' read -r filename lineno _ <<< "$result"
# Vim can accept line-number with +99
# But if your editor cannot, then you had better remove the + argument
verbosely "$FZF_EDITOR" +"$lineno" "$filename"
fi
}