Saltar a contenido

fzf (Fuzzy Finder) Hoja de Referencia

Instalación

Platform Comando
Ubuntu/Debian sudo apt update && sudo apt install fzf
Fedora/RHEL sudo dnf install fzf
Arch Linux sudo pacman -S fzf
macOS (Homebrew) brew install fzf && $(brew --prefix)/opt/fzf/install
Windows (Chocolatey) choco install fzf
Windows (Scoop) scoop install fzf
Windows (winget) winget install fzf
From Source git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install
Integración de Shell Post-Instalación:
# Bash
echo '[ -f ~/.fzf.bash ] && source ~/.fzf.bash' >> ~/.bashrc

# Zsh
echo '[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh' >> ~/.zshrc

Comandos Básicos

Comando Descripción
fzf Lanzar buscador difuso interactivo en stdin o archivos
vim $(fzf) Encontrar y abrir archivo en vim
ls \ | fzf Búsqueda difusa a través de la salida de ls
fzf --multi Habilitar modo de selección múltiple (usar Tab para seleccionar)
fzf --preview 'cat {}' Mostrar vista previa de archivo al navegar
fzf --reverse Mostrar resultados de arriba a abajo
fzf --height 40% Establecer altura del finder al 40% de la pantalla
fzf --border Agregar borde alrededor de la interfaz del finder
fzf --prompt "Select: " Personalizar el prompt de entrada
fzf --exact Utilizar coincidencia exacta en lugar de coincidencia aproximada
fzf +i Habilitar búsqueda sensible a mayúsculas y minúsculas
fzf --inline-info Mostrar información en línea con el prompt
find . -name "*.py" \ | fzf Buscar y filtrar tipos de archivo específicos
ps aux \ | fzf Buscar procesos en ejecución de forma interactiva
history \ | fzf Buscar en el historial de comandos
## Combinaciones de Teclas Predeterminadas
Enlace de Tecla Acción
Ctrl+T Pegar archivos/directorios seleccionados en la línea de comandos
Ctrl+R Buscar historial de comandos y pegar comando seleccionado
Alt+C Buscar directorio con fuzzy find y entrar en él
**<Tab> Trigger fuzzy completion (e.g., vim **<Tab>)
Ctrl+J / Ctrl+N Mover cursor hacia abajo
Ctrl+K / Ctrl+P Mover cursor hacia arriba
Enter Seleccionar elemento y salir
Tab Seleccionar/deseleccionar elemento en modo de selección múltiple
Shift+Tab Deseleccionar elemento en modo de selección múltiple
Ctrl+C / Esc Cancelar y salir
## Uso Avanzado
Comando Descripción
fzf --preview 'bat --color=always {}' Vista previa con resaltado de sintaxis usando bat
fzf --preview-window=right:50% Posicionar ventana de vista previa a la derecha con un ancho del 50%
fzf --preview-window=hidden Comienza con vista previa oculta (alternar con Ctrl+/)
fzf --bind 'ctrl-e:execute(vim {})' Ejecutar vim en el elemento seleccionado con Ctrl+E
fzf --bind 'ctrl-y:execute-silent(echo {} \ | pbcopy)' Copiar selección al portapapeles silenciosamente
fzf --delimiter=' ' --nth=2.. Buscar solo desde el 2º campo en adelante
fzf --header="Select file to edit" Agregar texto de encabezado al finder
fzf --color=dark Usar esquema de color oscuro
fzf --query="initial" Prepoblar consulta de búsqueda
fzf --select-1 --exit-0 Autoseleccionar si hay una coincidencia, salir si no hay ninguna
fzf --expect=ctrl-d,ctrl-e Devolver diferentes códigos de salida para diferentes claves
fzf --print-query Imprimir cadena de consulta incluso si no hay coincidencia
fzf --cycle Habilitar ciclo de resultados (envolver)
fzf --no-mouse Deshabilitar soporte de mouse
fzf --algo=v2 Usar algoritmo de coincidencia más rápido para conjuntos de datos grandes
fzf --tac Invertir orden de entrada
fzf --no-sort Deshabilitar ordenación, mantener orden de entrada
fzf --border=rounded Usar estilo de borde redondeado
fzf --sync Utilizar filtrado síncrono (sin async)
fzf --scroll-off=5 Mantener elemento seleccionado a 5 líneas del borde
## Configuración

Variables de Entorno

Archivo de Configuración Principal: ~/.bashrco ~/.zshrc

# Default command for finding files (using fd)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'

# Default options applied to all fzf invocations
export FZF_DEFAULT_OPTS='
  --height 40%
  --layout=reverse
  --border
  --inline-info
  --preview "bat --style=numbers --color=always --line-range :500 {}"
  --preview-window=right:50%:hidden
  --bind "ctrl-/:toggle-preview"
  --bind "ctrl-y:execute-silent(echo {} | pbcopy)"
'

# Ctrl+T configuration (file finder)
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_CTRL_T_OPTS="
  --preview 'bat --color=always --line-range :50 {}'
  --bind 'ctrl-/:change-preview-window(down|hidden|)'
"

# Alt+C configuration (directory finder)
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'
export FZF_ALT_C_OPTS="
  --preview 'tree -C {} | head -50'
"

# Ctrl+R configuration (history search)
export FZF_CTRL_R_OPTS="
  --preview 'echo {}'
  --preview-window up:3:hidden:wrap
  --bind 'ctrl-/:toggle-preview'
  --bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort'
  --color header:italic
  --header 'Press CTRL-Y to copy command into clipboard'
"

Configuración de Esquema de Color

# Monokai theme
export FZF_DEFAULT_OPTS='
  --color=bg+:#293739,bg:#1B1D1E,border:#808080
  --color=spinner:#E6DB74,hl:#7E8E91,fg:#F8F8F2
  --color=header:#7E8E91,info:#A6E22E,pointer:#A6E22E
  --color=marker:#F92672,fg+:#F8F8F2,prompt:#F92672,hl+:#F92672
'

# Dracula theme
export FZF_DEFAULT_OPTS='
  --color=fg:#f8f8f2,bg:#282a36,hl:#bd93f9
  --color=fg+:#f8f8f2,bg+:#44475a,hl+:#bd93f9
  --color=info:#ffb86c,prompt:#50fa7b,pointer:#ff79c6
  --color=marker:#ff79c6,spinner:#ffb86c,header:#6272a4
'

# Nord theme
export FZF_DEFAULT_OPTS='
  --color=fg:#e5e9f0,bg:#3b4252,hl:#81a1c1
  --color=fg+:#e5e9f0,bg+:#434c5e,hl+:#81a1c1
  --color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
  --color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b
'

Casos de Uso Comunes

Caso de Uso: Cambio de Rama de Git

# Interactive git branch selection
git checkout $(git branch -a | fzf | sed 's/^[ *]*//' | sed 's/remotes\/origin\///')

# Or create an alias
alias gcb='git checkout $(git branch | fzf | sed "s/^[ *]*//")'

Caso de Uso: Matar Proceso

# Find and kill process interactively
kill -9 $(ps aux | fzf | awk '{print $2}')

# Or create a function
fkill() {
  local pid
  pid=$(ps aux | sed 1d | fzf -m | awk '{print $2}')
  if [ "x$pid" != "x" ]; then
    echo $pid | xargs kill -${1:-9}
  fi
}

Caso de Uso: Selección de Host SSH

# Select from SSH config hosts
ssh $(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2- | fzf)

# Or create an alias
alias fssh='ssh $(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2- | fzf)'

Caso de Uso: Navegación de Directorio con Historial

# Create a function to track and jump to directories
fcd() {
  local dir
  dir=$(find ${1:-.} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf +m) && cd "$dir"
}

# Jump to frequently used directories (requires z or autojump)
fz() {
  local dir
  dir=$(z -l 2>&1 | fzf --height 40% --nth 2.. --reverse --inline-info +s --tac --query "${*}" | sed 's/^[0-9,.]* *//')
  cd "$dir"
}

Caso de Uso: Gestión de Contenedores Docker

# Select and attach to running container
docker exec -it $(docker ps | fzf | awk '{print $1}') /bin/bash

# Select and stop containers
docker stop $(docker ps -a | fzf -m | awk '{print $1}')

# Select and remove images
docker rmi $(docker images | fzf -m | awk '{print $3}')

Caso de Uso: Visor de Variables de Entorno

# Browse and copy environment variables
env | fzf --preview 'echo {}' --preview-window=up:3:wrap \
  --bind 'enter:execute(echo {} | cut -d= -f2 | pbcopy)+abort'

Caso de Uso: Análisis de Archivos de Registro

# Search through log files with preview
find /var/log -type f 2>/dev/null | fzf \
  --preview 'tail -100 {}' \
  --bind 'enter:execute(less {})'

# Search log content
grep -r "ERROR" /var/log 2>/dev/null | fzf \
  --delimiter=: \
  --preview 'bat --color=always {1} --highlight-line {2}' \
  --preview-window +{2}-/2

Mejores Prácticas

  • Usar con fd o ripgrep: Reemplazar findcon fdpara búsqueda de archivos más rápida: export FZF_DEFAULT_COMMAND='fd --type f'

  • Habilitar vista previa por defecto: Agregar ventanas de vista previa para ver contenidos de archivos antes de seleccionar, mejorando precisión y reduciendo errores

  • Crear alias de shell: Construir alias personalizados para flujos de trabajo frecuentes (operaciones de git, conexiones SSH, gestión de procesos) para maximizar productividad

  • Combinar con otras herramientas: Integrar fzf conbatpara resaltado de sintaxis,treepara vistas previas de directorios, ydeltapara diferencias de git

  • Usa la selección múltiple con inteligencia: Habilita --multimodo cuando necesites operar en múltiples elementos (eliminar archivos, hacer checkout de múltiples archivos git)

  • Aprovecha los atajos de teclado: Personaliza --bindopciones para crear accesos directos para acciones comunes (abrir en editor, copiar al portapapeles, ejecutar comandos)

  • Optimiza para conjuntos de datos grandes: Usa --algo=v2y considera --syncmodo para listas de archivos muy grandes para mejorar el rendimiento

  • Establece alturas apropiadas: Usa --height 40%o similar para evitar ocupar toda la pantalla, manteniendo el contexto de tu trabajo actual

  • Configura esquemas de color: Haz coincidir los colores de fzf con el tema de tu terminal para una mejor integración visual y reducir la fatiga visual

  • Usa delimitadores de campos: Al analizar salidas estructuradas (como pso docker), usa --delimitery --nthpara buscar columnas específicas

Resolución de problemas

Problema Solución
Key bindings not working Run the install script: ~/.fzf/install or source the shell integration file in your RC file
Slow performance with large file lists Use fd or ripgrep instead of find: export FZF_DEFAULT_COMMAND='fd --type f' and consider --algo=v2
Preview not showing file contents Ensure preview command is correct and file is readable. Try --preview 'cat {}' or install bat for better previews
Colors not displaying correctly Check terminal supports 256 colors. Use --color=16 for basic color support or adjust color scheme
Command not found after installation Add fzf to PATH or restart shell. For Homebrew: ensure /usr/local/bin or /opt/homebrew/bin is in PATH
Unicode characters not rendering Ensure terminal and locale support UTF-8: export LC_ALL=en_US.UTF-8 and use a Unicode-capable font
fzf consuming too much memory Reduce input size or use --sync mode. Consider filtering input before piping to fzf
Preview window not updating Use --preview-window=follow for auto-scrolling or toggle preview with Ctrl+/ to refresh
Cannot select items with mouse Mouse support may be disabled. Remove --no-mouse option or click outside fzf and retry
Completion not working with **<Tab> Ensure shell integration is loaded. Check ~/.fzf.bash or ~/.fzf.zsh is sourced in your RC file
## Sintaxis de Búsqueda
Sintaxis Descripción Ejemplo
term Fuzzy match fzf with input "abc" matches "a_b_c.txt"
'term Coincidencia exacta (prefijo de comilla simple) 'abc matches only "abc" exactly
^term Coincidencia exacta de prefijo ^abc matches "abc..." but not "zabc"
term$ Coincidencia exacta de sufijo abc$ matches "...abc" but not "abcz"
!term Coincidencia inversa (excluir) !test excludes lines with "test"
term1 term2 Y coincidencia (ambos requeridos) foo bar matches lines with both terms
term1 \ | term2 Coincidencia OR (cualquiera requerido) foo \ | bar matches lines with either term
## Funciones de Shell Útiles```bash
# Open file in editor with preview
fe() {
local files
files=\((fzf --query="\)1" --multi --select-1 --exit-0 \
--preview 'bat --color=always --line-range :500 {}')
[[ -n "$files" ]] && \({EDITOR:-vim} "\)"
}

Change to directory with preview

fcd() { local dir dir=\((fd --type d --hidden --follow --exclude .git | fzf \ --preview 'tree -C {} | head -100') && cd "\)dir" }

Git commit browser

fgc() { git log --oneline --color=always | fzf --ansi \ --preview 'git show --color=always {1}' \ --bind 'enter:execute(git show {1} | less -R)' }

Browse and install packages (Debian/Ubuntu)

fap() { apt-cache search . | fzf --multi --preview 'apt-cache show {1}' | \ awk '{print $1}' | xargs -ro sudo apt install } ```