如何使用 FZF 搜尋檔案 *contents* (grep/ag/rg)?

如何使用 FZF 搜尋檔案 *contents* (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..

如果任何已處理的檔案的:檔案名稱中包含 a ,這將會中斷,但我預計這種情況不會經常發生。

答案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
}

相關內容