Wie durchsucht man mit FZF den Datei*inhalt* (grep/ag/rg)?

Wie durchsucht man mit FZF den Datei*inhalt* (grep/ag/rg)?

Wenn ich eine projektweite (mehrere Dateien) Suche durchführe durchFZFsind die Ergebnisse überflutet mit Zeilen, derenDateipfadentspricht der Abfrage und verdrängt die relevanteren Ergebnisse, bei denen die DateiInhaltabgestimmt.

Beispielsweise führt man denAg-Beispiel aus dem Wiki,

ag --nobreak --nonumbers --noheading . | fzf

Ich werde danach fragen searchund etwas wie das hier bekommen,

  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

Was mache ich falsch? Wenn ich eine ähnliche Ag-Abfrage ohne FZF ausführe, erhalte ich nur die Ergebnisse, bei denen meine Abfrage im Dateiinhalt vorkommt (was ich will).

Antwort1

Ich habe die Interaktion zwischen ag und fzf falsch verstanden und dachte, die Abfrage, die ich eingegeben habe, würde irgendwie durch ag geleitet, bevor sie an fzf weitergeleitet wird. Im Nachhinein war das ein dummer Fehler, da fzf genau das Filtern macht und ag einfach dazu verwendet wird, um Unmengen sinnvoller Zeilen zu generieren.

Um das zu erreichen, was ich wollte, habe ich mir das Format der von ag generierten Zeilen angesehen, z. B.

plugin/coherent.vim:set incsearch

Weisen Sie fzf an, es als Feldtrennzeichen zu behandeln :und den Suchumfang auf die Felder 2, 3, 4 usw. zu beschränken.

ag --nobreak --nonumbers --noheading . | fzf --delimiter=: --nth=2..

Dies schlägt fehl, wenn eine der verarbeiteten Dateien ein :im Dateinamen enthält, aber ich gehe nicht davon aus, dass dies allzu oft vorkommt.

Antwort2

Für alle, die nach einem Ripgrep-Skript suchen, hier ist mein Ergebnis:

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
}

verwandte Informationen