¿Cómo buscar archivos *contenidos* (grep/ag/rg) usando FZF?

¿Cómo buscar archivos *contenidos* (grep/ag/rg) usando FZF?

Cuando ejecuto una búsqueda en todo el proyecto (varios archivos) a través deFZF, los resultados están inundados de líneas cuyasruta de archivocoincide con la consulta, desplazando los resultados más relevantes donde el archivocontenidoemparejado.

Por ejemplo, ejecutar elEjemplo de agricultura de la wiki,

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

Consultaré searchy obtendré algo como esto,

  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

¿Qué estoy haciendo mal? Cuando ejecuto una consulta Ag similar sin FZF, solo obtengo los resultados donde ocurrió mi consulta en el contenido del archivo (que es lo que quiero).

Respuesta1

Estaba entendiendo mal la interacción entre ag y fzf, pensando que la consulta que escribí pasó de alguna manera a través de ag antes de enviarla a fzf. En retrospectiva, fue un error tonto, ya que el filtrado es exactamente lo que hace fzf, y ag se usa simplemente como una forma de generar toneladas de líneas significativas.

Para obtener lo que quería de esto, miré el formato de las líneas que generó ag, por ejemplo

plugin/coherent.vim:set incsearch

Dígale a fzf que lo trate :como delimitador de campo y que debe restringir el alcance de su búsqueda a los campos 2, 3, 4,...

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

Esto se romperá si alguno de los archivos procesados ​​contiene a :en su nombre, pero eso es algo que no espero que suceda con demasiada frecuencia.

Respuesta2

Para cualquiera que busque un script ripgrep, esto es lo que se me ocurrió:

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
}

información relacionada