22 puntos por GN⁺ 2026-05-11 | 1 comentarios | Compartir por WhatsApp
  • El buscador difuso de línea de comandos fzf ofrece un valor inmediato y único en relación con la inversión, pero muchos desarrolladores lo instalan, no saben cómo aprovecharlo y terminan abandonándolo
  • Puede reemplazar la búsqueda del historial con Ctrl+R por coincidencia difusa y vista previa múltiple, resolviendo la incomodidad del método anterior basado en coincidencia exacta de cadenas
  • Con Alt+C, incluso si solo recuerdas vagamente el nombre de un directorio, puedes hacer cd difuso, y también puedes armar un flujo de trabajo para abrir archivos al instante con la combinación vi $(fzf)
  • Al conectarlo por pipe con ripgrep, puedes hacer un uso avanzado: buscar difusamente todas las líneas de todos los archivos y luego abrir de inmediato ese archivo en el editor
  • Es una herramienta con una mejora de productividad tan inmediata que incluso rompe la heurística 80/20 de aprender primero herramientas Unix tradicionales como cat, grep y find

El valor que obtienes justo después de instalar fzf

  • Los ingenieros de software pueden crear con facilidad herramientas para mejorar su propio trabajo, pero si van saltando entre muchas herramientas sin dominarlas a fondo, el costo crece con el tiempo
  • Una buena heurística 80/20 es aprender primero herramientas Unix antiguas como cat, ls, cd, grep y cut; en funciones modernas de administración de sistemas también entran sed y awk
  • fzf puede verse como una excepción a esa heurística porque su retorno sobre la inversión es inmediato y su valor es único
  • Lo clave son las funciones que puedes usar enseguida después de instalarlo con el script de instalación de fzf en un entorno Ubuntu estándar

Efecto inmediato de los atajos predeterminados

  • Ctrl+R: convierte el historial de comandos en una búsqueda difusa

    • En la mayoría de terminales de Linux y Windows, Ctrl+R ofrece búsqueda inversa del historial de comandos
    • El Ctrl+R predeterminado requiere una coincidencia exacta para encontrar el comando que quieres, y además solo muestra una vista previa a la vez, así que si fallas por una sola letra se vuelve difícil encontrarlo
    • Al instalar fzf, varios atajos de teclado se sobrescriben con un comportamiento mejor, y Ctrl+R también mejora mucho frente al método anterior
    • Si lo instalas con un gestor de paquetes como apt, es posible que no se incluya esta integración de atajos, lo que explica por qué conviene usar el script de instalación de fzf
  • Alt+C: ir rápido a un directorio que recuerdas vagamente

    • fzf convierte Alt+C en un atajo mejorado de cd difuso
    • Puedes moverte rápido cuando no recuerdas la ruta exacta de un directorio y solo tienes presente un nombre aproximado
    • Es útil para encontrar repositorios o directorios de trabajo que no visitas desde hace tiempo desde una terminal vacía

El propio comando fzf y sus combinaciones con el shell

  • fzf básico

    • Si ejecutas el comando fzf tal cual, hace una búsqueda difusa de rutas de archivos relativas tomando como base el directorio actual
    • Por sí solo, su utilidad es limitada porque básicamente solo sirve para elegir la ubicación de un archivo
  • vi $(fzf)

    • Si lo combinas con sustitución de comandos, como en vi $(fzf), puedes abrir directamente en el editor el archivo que elegiste con búsqueda difusa
    • Esta forma no tiene nada especial de vi; también puede usarse con el editor que prefieras, como emacs, nano, code, etc.
  • vi $(find . '/' | fzf)

    • Si combinas find . '/' | fzf con un editor, puedes buscar difusamente entre candidatos de ruta completa y abrir un archivo de configuración cuya ubicación no conoces
    • Cuando quieres encontrar un archivo como nginx.conf pero no recuerdas dónde está, en vez de intentar adivinar o memorizar su ubicación a partir del FHS, basta con pasar la salida de find a fzf
    • Si buscas algo como conf$, puedes filtrar solo las líneas que terminan en conf
    • Si find se topa con muchos errores de Permission denied, fzf puede tambalearse un momento, pero se recupera después de unos segundos
    • Esos segundos de retraso son el intercambio a cambio de la comodidad de encontrar archivos de configuración de una forma muy simple
  • vi **<TAB>

    • Una función mencionada en un comentario de Hacker News de sigmonsays, ubicada más o menos a mitad de camino entre sobrescribir atajos y ejecutar fzf directamente, es la autocompletación difusa con doble asterisco
    • vi **<TAB> puede usarse para elegir archivos de forma parecida a vi $(fzf)
    • Después de que se completa el comando real, todavía tienes que presionar Enter una vez más
    • Funciona bien en bash y zsh, pero en fish puede que no funcione
    • Si te resulta más fácil recordar la forma de invocarlo explícitamente con $(fzf), quizá no uses esta función tan seguido

Usar fzf también para mover archivos

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) sirve cuando no recuerdas exactamente qué quieres mover ni a dónde quieres moverlo, pero sí tienes pistas muy concretas sobre cada uno
    • La idea es elegir con dos selecciones de fzf tanto el elemento a mover como el destino
    • Puede volverse algo que uses con frecuencia al mover y acomodar archivos, por ejemplo al agregar GIFs a un README de GitHub
    • Como ejemplo relacionado, se enlaza el README del modo interactivo de finstem

Búsqueda difusa incluso dentro del contenido de archivos con rg

  • rg: un grep rápido con búsqueda recursiva por defecto

    • La combinación de abajo también se puede hacer con grep, pero rg o ripgrep tiene la ventaja de que busca recursivamente por defecto
    • Para seguir el ejemplo, se recomienda instalar y usar rg
  • rg . | fzf

    • rg . envía como resultados de búsqueda cada línea de los archivos, y si eso se pasa a fzf, puedes buscar difusamente entre todas las líneas de todos los archivos
    • En vez de buscar por nombre de archivo, aquí buscas a partir del contenido de una línea dentro del archivo
  • rg . | fzf | cut -d ":" -f 1

    • Si al resultado elegido con rg . | fzf le agregas cut -d ":" -f 1, puedes devolver el primer campo separado por dos puntos, es decir, la ubicación del archivo
    • Es una combinación para buscar difusamente por contenido de línea y luego obtener solo la ruta del archivo que contiene esa línea
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) es una combinación que busca difusamente entre todas las líneas de todos los archivos y luego abre en vim el archivo que contiene la línea seleccionada
    • Si no recuerdas el nombre del archivo y solo recuerdas parte de su contenido, puedes saltar directo al editor

1 comentarios

 
GN⁺ 2026-05-11
Comentarios de Lobste.rs
  • Siento que el público objetivo de este artículo soy exactamente yo. Instalé fzf, pensé “qué genial”, y luego seguía olvidando usarlo, pero ahora quizá sí lo use

    • La clave es integrarlo en tu configuración del shell existente, scripts personales y alias. Uso fzf todo el tiempo, pero casi nunca lo ejecuto directamente
  • Puede que sea un buen artículo, pero si el objetivo es responder “¿y ahora qué hago?”, empezar por la integración con el shell de fzf da la impresión de que apunta a un público más limitado
    Ya estoy acostumbrado a usar ctrl-r en bash, así que pedir que lo cambie es poner la vara demasiado alta. Me habría gustado que primero explicara cómo practicar el mismo comportamiento sin reemplazar el valor predeterminado

    • En la práctica, es más bien un valor predeterminado mejorado. Lo correcto es dejar que reemplace ctrl-r, y la mitad de su atractivo está en conservar una acción familiar dentro de tus dedos mientras obtienes una experiencia más rica con un flujo casi igual al de siempre
      ctrl-r es probablemente el comando que más uso, y fzf fue una mejora que encajó de inmediato sin curva de aprendizaje. Como se ejecuta con ctrl-r, tampoco se me olvida usar fzf. Eso sí, después me pasé a Fish shell, donde ese mismo comportamiento ya viene por defecto
  • Me convencieron. Pronto voy a agregar fzf y la integración con el shell, y hoy aprendí algo nuevo

  • Cuando buscas archivos para meter en un comando, también puedes usar el atajo ctrl-t. Lo uso seguido con git para elegir archivos que quiero incluir en cierto cambio, y también lo he usado para filtrar resultados de grep y reducir el alcance de la búsqueda

  • Además de mejorar la búsqueda en el historial del shell, he usado fzf con estos dos alias
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Lo uso principalmente para elegir qué ramas locales borrar después de fusionar pull requests. Puede que haya una mejor forma, pero hasta ahora nunca me ha fallado
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    Esto me permite cambiar rápido AWS_PROFILE según los valores en ~/.aws/config. Ahora estoy pensando en hacer un alias parecido para cambiar de namespace en Kubernetes

  • Si usas el plugin fzf.vim, puedes usar fzf dentro de vim. No solo para abrir archivos, sino también para buscar de forma difusa entre buffers, historial de comandos, contenido de archivos y más

  • Mi uso principal de fzf es recorrer y buscar el historial lineal de commits de Git para entender qué cambió recientemente
    En mi configuración base de Git, tengo git fzf definido así

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Siento que me estoy perdiendo de algo. Me pregunto por qué alguien instalaría fzf si no sabe qué hacer con él

  • También hay una publicación reciente relacionada. Un usuario está usando fzf como selector de archivos para jj
    https://lobste.rs/s/exlogg/jjj