¿Cómo reemplazar FIND, GREP y CAT con una búsqueda Moderna e Interactiva desde la Terminal?

Si pasas la mayoría de tu tiempo en la terminal buscando archivos o contenido dentro de ellos, es muy probable que hayas usado los clásicos comandos find, grep y cat.

Aunque útiles, estos comandos pueden sentirse torpes o poco interactivos cuando trabajas con grandes proyectos o código fuente. Afortunadamente, una combinación poderosa de herramientas modernas puede transformar tu búsqueda en algo mucho más eficiente, visual e interactivo.

La receta que exploramos aquí combina tres herramientas muy modernas y populares:

  • fzf -> un buscador fuzzy interactivo para terminal
  • ripgrep (rg) -> búsqueda de contenido rápida y eficiente
  • bat -> muestra archivos con sintaxis resaltada y vista previa enriquecida

¿Por qué esta combinación de comandos es superior a los clásicos find, grep y cat?

1. 📂 ripgrep (rg): búsqueda rápida y sensible al contexto

ripgrep es un buscador inspirado en grep pero mucho más rápido y, respetuoso de .gitignore con soporte para expresiones regulares y búsquedas recursivas.

  • Escanea grandes proyectos en segundos
  • Permite incluir número de línea y columna
  • Tiene detección inteligente de mayúsculas (“smart case”)

2. 🔍 fzf: filtro fuzzy interactivo

fzf muestra los resultados en una lista interactiva que puedes filtrar en tiempo real. A medida que escribes, la lista se actualiza, permitiéndote encontrar lo que buscas sin recordar rutas completas o nombres exactos.

3. 📄 bat: vista previa con estilo

bat es como cat pero con:

  • Resaltado de sintaxis
  • Encabezados
  • Temas de color
  • Integración rápida con terminales modernas

Combinado con fzf puedes ver el contenido de cada archivo antes de abrirlo.

Un comando mágico de búsqueda interactiva

Aquí tienes un ejemplo avanzado que integra todas estas herramientas en una función de shell que puedes añadir a tu .bashrc o .zshrc:

s() {
  : | fzf \
    --ansi \
    --disabled \
    --bind "change:reload:sleep 0.1; \
                  command rg --line-number \
                            --column \
                            --no-heading \
                            --color=always \
                            --smart-case {q} \
                            $* \
                  || :" \
    --bind "enter:execute:nano +{2},{3} {1}" \
    --bind "ctrl-o:become:nano +{2},{3} {1}" \
    --delimiter ":" \
    --preview "command bat --style=full \
                           --color=always \
                           --highlight-line {2} \
                           {1}" \
    --preview-window 'up:80%,border-bottom,~4,+{2}+4/3'
}

¿Cómo funciona esta maravilla?

1. Búsqueda reactiva con ripgrep

El corazón de este comando está en:

--bind "change:reload:sleep 0.1; command rg ... {q} $* || :"

Esto hace que, cada vez que escribas algo en fzf, ripgrep busque ese texto dentro de tus archivos. El sleep 0.1 actúa como debouncer, evitando búsquedas excesivas por cada tecla

La salida de ripgrep (archivo:linea:columna:coincidencia) se pasa a fzf.

2. Navegación y apertura automática

Con estas dos líneas:

--bind "enter:execute:nano +{2},{3} {1}" \
--bind "ctrl-o:become:nano +{2},{3} {1}"

Puedes:

  • Presionar Enter para abrir la coincidencia en tu editor (en este caso nano)
  • Presionar Ctrl+O para abrir y salir de la búsqueda directamente
  • Los placeholders {1}, {2}, {3} representan archivo, línea y columna respectivamente

📌 Si usas vim, nvim o emacs, también puedes personalizarlo así:

--bind "enter:execute:nvim '+call cursor({2},{3})' {1}" \
--bind "ctrl-o:become:nvim '+call cursor({2},{3})' {1}"

3. Vista previa perfecta con bat

La opción de vista previa permite que, mientras navegas por los resultados, veas el contenido del archivo con resaltado de sintaxis y líneas relevantes:

--preview "command bat --style=full --color=always --highlight-line {2} {1}"

Además, puedes controlar dónde aparece esa vista previa:

--preview-window 'up:80%,border-bottom,~4,+{2}+4/3'

La configuración anterior hace que la vista previa ocupe el 80 % de la pantalla, con bordes y resaltado de la línea coincidente.


Ventajas de usar esta función

Muucho más rápida que usar find | grep manualmente
Buscar y visualizar resultados en tiempo real
Abrir directamente en tu editor desde la terminal
Permite combinar filtros avanzados ($*)
Personalizable según tus necesidades

Consejos para mejorar aún más

  • Limita rutas de búsqueda para acelerar el proceso (s path/to/project)
  • Filtra archivos no deseados añadiendo --glob o --ignore-case a ripgrep
  • Instala bat, fzf y ripgrep a través de tu gestor de paquetes favorito antes de usar la función
  • Prueba alias como alias s="s ." para ajustar al proyecto actual

Limitaciones y consideraciones

Esta función no indexa todo el sistema como lo haría un motor de búsqueda dedicado (por ejemplo, uno basado en una base de datos). Eso significa que:

  • No es tan rápido para búsquedas globales en sistemas gigantescos
  • Sin embargo, para proyectos de código y carpetas comunes, ripgrep es extremadamente rápido

Conclusión

Si estás cansado de combinar manualmente find, grep, y cat para buscar dentro de archivos, esta función te da:

  • Una experiencia de búsqueda interactiva superior
  • Resultados en tiempo real conforme escribes tu consulta
  • Vista previa enriquecida con sintaxis
  • Apertura inmediata en cualquier editor

Convierte tu terminal en un explorador de código súper eficiente con solo unas líneas en tu configuración de shell.