如何使用 FZF 搜索文件*内容*(grep/ag/rg)?

如何使用 FZF 搜索文件*内容*(grep/ag/rg)?

当我运行项目范围(多文件)搜索时自由落体,结果充斥着这样的行文件路径匹配查询,挤出更相关的结果,其中文件内容匹配。

例如,运行来自 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
}

相关内容