32blogby StudioMitsu

Guía completa de fzf: búsqueda difusa que lo cambia todo

Instala fzf, intégralo con tu shell, potencia Ctrl+R y Ctrl+T, conéctalo con Git y personalízalo para tu flujo de trabajo.

9 min read
Contenido

"¿Dónde estaba ese archivo?" "¿Cuál fue ese comando que ejecuté hace tres días?" "Tengo demasiadas ramas de Git para llevar la cuenta."

La búsqueda es uno de los mayores sumideros de tiempo en el trabajo con la terminal. history | grep y find . -name solo llegan hasta cierto punto.

Entra fzf — un buscador difuso que te permite buscar interactivamente archivos, historial de comandos, ramas de Git, procesos y prácticamente cualquier otra cosa. Una vez que empiezas a usarlo, no hay vuelta atrás al Ctrl+R básico.

¿Qué es fzf?

fzf es un buscador difuso interactivo escrito en Go por junegunn (también conocido por vim-plug y fzf.vim).

Sigue la filosofía UNIX: lee líneas de stdin, deja al usuario elegir una y la escribe en stdout. Este diseño de "acepta cualquier cosa, devuelve cualquier cosa" hace de fzf una herramienta universal que se integra con cualquier flujo de trabajo.

Características clave:

  • Coincidencia difusa: no necesitas cadenas exactas — palabras clave parciales reducen los resultados al instante
  • Increíblemente rápido: v0.70.0 mejoró el rendimiento del filtrado en 1.3–1.9x. Decenas de miles de archivos no son problema
  • Integración con el shell: potencia Ctrl+R (búsqueda de historial), Ctrl+T (inserción de ruta de archivo) y Alt+C (saltar a directorio)
  • Vista previa: ve el contenido de archivos o diffs de Git en tiempo real antes de seleccionar
  • Se canaliza con todo: filtra la salida de find, git, ps, docker — cualquier comando que produzca líneas

Instalación y configuración

Si usas WSL, sigue las instrucciones de Linux de arriba.

Para PowerShell:

powershell
winget install junegunn.fzf

Integración con el shell

fzf 0.48+ simplificó enormemente la integración con el shell. Añade lo siguiente a tu archivo de configuración del shell:

Para bash (~/.bashrc):

bash
eval "$(fzf --bash)"

Para zsh (~/.zshrc):

bash
source <(fzf --zsh)

Aplica los cambios:

bash
source ~/.bashrc  # para bash
source ~/.zshrc   # para zsh

Uso básico

Búsqueda difusa de archivos

Ejecuta fzf sin argumentos para listar todos los archivos bajo el directorio actual y reducirlos interactivamente.

bash
fzf

Cualquier archivo cuya ruta contenga los caracteres que escribes permanecerá como candidato. No necesitas una coincidencia exacta — escribir cnf coincide con config, conf.yaml, nginx.conf y más.

Canalizar entrada a fzf

Aquí es donde fzf realmente brilla.

bash
# Buscar solo archivos JavaScript
find . -name "*.js" | fzf

# Buscar variables de entorno
env | fzf

# Buscar comandos recientes
history | fzf

Seleccionar múltiples elementos

El flag -m (--multi) habilita la selección múltiple con Tab.

bash
# Seleccionar múltiples archivos y eliminarlos
rm $(fzf -m)

Vista previa de archivos al seleccionar

La opción --preview muestra el contenido del archivo junto a la lista de candidatos. Si tienes bat instalado, obtienes resaltado de sintaxis gratis.

bash
# Vista previa con cat
fzf --preview 'cat {}'

# Vista previa con bat (con resaltado de sintaxis)
fzf --preview 'bat --color=always {}'

Empezar con una consulta inicial

Usa -q para pre-rellenar el campo de búsqueda.

bash
fzf -q "test"

Pasar el resultado a otro comando

Usa $(fzf) para alimentar el archivo seleccionado a cualquier comando.

bash
# Abrir el archivo seleccionado en vim
vim $(fzf)

# Abrir el archivo seleccionado en VS Code
code $(fzf)

Integración con el shell

La integración con el shell es la característica estrella de fzf. Aprende tres atajos de teclado y tu experiencia en la terminal se transformará.

Ctrl+R — búsqueda difusa del historial de comandos

fzf reemplaza el Ctrl+R integrado del shell (reverse-i-search):

  • Ctrl+R estándar: recorre el historial una entrada a la vez
  • Ctrl+R de fzf: busca difusamente todo el historial y encuentra lo que necesitas al instante
bash
# Cómo usarlo: presiona Ctrl+R en el prompt
# → fzf se abre con tu historial completo de comandos
# → escribe palabras clave para reducir resultados
# → presiona Enter para insertar el comando seleccionado

¿Ese comando de docker-compose de hace tres días? Simplemente escribe dock y ahí está.

Ctrl+T — insertar una ruta de archivo

Presiona Ctrl+T mientras escribes un comando para buscar un archivo e insertar su ruta.

bash
# Cómo usarlo:
# escribe "vim " y luego presiona Ctrl+T
# → fzf se abre, buscas y seleccionas un archivo
# → "vim ruta/al/archivo/seleccionado" aparece en tu línea de comandos

Mucho más rápido que autocompletar con Tab a través de árboles de directorios profundos.

Alt+C — saltar a un directorio

Presiona Alt+C para buscar difusamente directorios y hacer cd al seleccionado.

bash
# Cómo usarlo: presiona Alt+C
# → fzf muestra un listado de directorios
# → selecciona uno y cd se ejecuta automáticamente

No más cd + Tab + Tab + Tab para navegar por carpetas anidadas.

Personalizar los comandos por defecto

Puedes controlar qué lista fzf configurando variables de entorno. fd (una alternativa rápida a find escrita en Rust) respeta automáticamente .gitignore y es mucho más rápido.

bash
# Si fd está instalado (añadir a .bashrc / .zshrc)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'

Consulta Herramientas CLI modernas en Rust para más sobre fd.

Casos de uso reales

El verdadero poder de fzf viene de combinarlo con otros comandos. Aquí tienes patrones que puedes usar de inmediato.

Potenciar las operaciones de Git

Git se hace más difícil de navegar a medida que las ramas y commits se acumulan. fzf lo hace sencillo.

bash
# Buscar difusamente y cambiar de rama
git checkout $(git branch --all | fzf)

# Buscar difusamente commits (con vista previa de diff)
git log --oneline | fzf --preview 'git show {+1}'

# Buscar difusamente archivos modificados (con vista previa de diff)
git diff --name-only | fzf --preview 'git diff {}'

Encontrar y terminar procesos

Cazar un proceso desbocado es una sola línea con fzf.

bash
# Buscar un proceso y terminarlo
kill $(ps aux | fzf | awk '{print $2}')

# Forzar terminación
kill -9 $(ps aux | fzf | awk '{print $2}')

ripgrep + fzf para búsqueda de código

Combina los resultados de ripgrep con fzf para buscar en tu base de código y previsualizar coincidencias en contexto. Perfecto para encontrar TODOs o patrones de errores.

bash
# Buscar comentarios TODO con vista previa
rg --line-number "TODO" | fzf --delimiter ':' --preview 'bat --color=always --highlight-line {2} {1}'

Operaciones con contenedores Docker

Selecciona un contenedor en ejecución y entra a su shell.

bash
# Elegir un contenedor e iniciar bash
docker exec -it $(docker ps --format '{{.Names}}' | fzf) bash

# Ver logs de un contenedor
docker logs --tail 100 $(docker ps --format '{{.Names}}' | fzf)

Selección de hosts SSH

Elige un host de tu ~/.ssh/config y conéctate.

bash
# Buscar difusamente hosts SSH
ssh $(grep "^Host " ~/.ssh/config | awk '{print $2}' | fzf)

Personalización

Opciones por defecto

La variable de entorno FZF_DEFAULT_OPTS controla la apariencia y el comportamiento de fzf.

bash
# Añadir a .bashrc / .zshrc
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --info=inline
  --margin=1
  --padding=1
'
  • --height 40%: usa solo el 40% de la pantalla (sin ocupar toda la pantalla)
  • --layout=reverse: muestra candidatos de arriba a abajo (por defecto es de abajo a arriba)
  • --border: dibuja un borde alrededor del buscador
  • --info=inline: muestra el conteo de coincidencias en la línea del prompt

Esquema de colores

Personaliza los colores con la opción --color.

bash
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --color=fg:#c0caf5,bg:#1a1b26,hl:#bb9af7
  --color=fg+:#c0caf5,bg+:#292e42,hl+:#7dcfff
  --color=info:#7aa2f7,prompt:#7dcfff,pointer:#ff007c
  --color=marker:#9ece6a,spinner:#9ece6a,header:#9ece6a
'

Personalización de atajos de teclado

La opción --bind te permite añadir atajos de teclado personalizados dentro de fzf.

bash
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --bind "ctrl-y:execute-silent(echo {} | xclip -selection clipboard)"
  --bind "ctrl-e:execute(vim {})"
'
  • ctrl-y: copiar el elemento actual al portapapeles
  • ctrl-e: abrir el archivo actual en vim

Funciones de shell para patrones comunes

Envuelve los patrones que uses frecuentemente en funciones de shell. Añade estas a ~/.bashrc o ~/.zshrc.

bash
# Elegir un archivo con vista previa y abrir en vim
fv() {
  local file
  file=$(fzf --preview 'bat --color=always {}' --height 80%)
  [ -n "$file" ] && vim "$file"
}

# Cambiar de rama Git con fzf
fb() {
  local branch
  branch=$(git branch --all | fzf --height 40% | sed 's/^[* ]*//' | sed 's|remotes/origin/||')
  [ -n "$branch" ] && git checkout "$branch"
}

# cd a un directorio con vista previa
fd_cd() {
  local dir
  dir=$(find . -type d 2>/dev/null | fzf --preview 'ls -la {}' --height 60%)
  [ -n "$dir" ] && cd "$dir"
}

Conclusión

fzf toma el concepto simple de coincidencia difusa y, a través de la filosofía de pipes de UNIX, lo convierte en una herramienta universal.

Esto es todo lo que necesitas para empezar:

  1. Instala fzf y habilita la integración con el shell (añade eval "$(fzf --bash)" a .bashrc)
  2. Empieza a usar Ctrl+R / Ctrl+T / Alt+C (aumento de productividad inmediato)
  3. Instala fd y bat, luego configúralos como predeterminados (búsqueda más rápida, mejores vistas previas)

Estos tres pasos te dan la mayor parte de los beneficios de fzf. A medida que te sientas cómodo, añade integraciones con Git y funciones de shell para construir un flujo de trabajo que sea únicamente tuyo.

Artículos relacionados: