"¿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) yAlt+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:
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):
eval "$(fzf --bash)"
Para zsh (~/.zshrc):
source <(fzf --zsh)
Aplica los cambios:
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.
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.
# 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.
# 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.
# 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.
fzf -q "test"
Pasar el resultado a otro comando
Usa $(fzf) para alimentar el archivo seleccionado a cualquier comando.
# 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+Restándar: recorre el historial una entrada a la vezCtrl+Rde fzf: busca difusamente todo el historial y encuentra lo que necesitas al instante
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
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.
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 portapapelesctrl-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.
# 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:
- Instala fzf y habilita la integración con el shell (añade
eval "$(fzf --bash)"a .bashrc) - Empieza a usar Ctrl+R / Ctrl+T / Alt+C (aumento de productividad inmediato)
- 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:
- Guía de grep y ripgrep — detalles de integración ripgrep + fzf
- Guía de tmux — entorno de desarrollo para combinar con fzf
- Herramientas CLI modernas en Rust — fd, bat, eza y más
- Mapa del kit de herramientas CLI — la visión general de herramientas CLI