Como pesquisar *conteúdo* do arquivo (grep/ag/rg) usando FZF?

Como pesquisar *conteúdo* do arquivo (grep/ag/rg) usando FZF?

Quando executo uma pesquisa em todo o projeto (vários arquivos)FZF, os resultados são inundados com linhas cujascaminho de arquivocorresponde à consulta, eliminando os resultados mais relevantes onde o arquivoconteúdocoincide.

Por exemplo, executando oUm exemplo do wiki,

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

Vou consultar searche obter algo assim,

  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

O que estou fazendo de errado? Quando executo uma consulta Ag semelhante sem FZF, obtenho apenas os resultados onde minha consulta ocorreu no conteúdo do arquivo (que é o que desejo).

Responder1

Eu estava entendendo mal a interação entre ag e fzf, pensando que a consulta que digitei foi de alguma forma passada por ag antes de canalizar para fzf. Em retrospecto, esse foi um erro bobo de se cometer, já que a filtragem é exatamente o que o fzf faz, e o ag está sendo usado simplesmente como uma forma de gerar toneladas de linhas significativas.

Para conseguir o que queria com isso, olhei o formato das linhas que ag gerou, por exemplo

plugin/coherent.vim:set incsearch

Diga ao fzf para tratar :como delimitador de campo e que deve restringir o escopo de sua pesquisa aos campos 2, 3, 4,...

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

Isso será interrompido se algum dos arquivos processados ​​contiver a :no nome do arquivo, mas isso é algo que não espero que aconteça com muita frequência.

Responder2

Para quem procura um script ripgrep, foi isso que eu criei:

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
}

informação relacionada