fzf: un buscador fuzzy para Linux

Soy un aficionado a los directos de Internet, en diferentes plataformas, donde los desarrolladores te enseñan como crean los programas. Estos directos, muchos en inglés, son muy entretenidos y te permiten charlar con ellos de forma bastante amena. Es justo en uno de ellos, concretamente de Togglebit, donde, interesado por el conjunto de herramientas que utiliza para desarrollar, he conocido FZF, la estrella de esta entrada. (De hecho, he conocido unos cuantas más, pero iré hablando de ellas más adelante)

FZF tiene un nombre bastante curioso, ya que si utilizamos la traducción literal al castellano, el nombre sería el buscador difuso en inglés «fuzzy finder«. Se trata de una herramienta de línea de comandos, para sistemas GNU/Linux, además de otros similares a UNIX, además de Windows. Nos ofrece un filtro interactivo que puede realizar búsquedas en cualquier tipo de listas que se le ofrezca como entrada, ya sean archivos, historial de comandos o procesos.

Entre sus ventajas encontramos que es muy rápido, de uso general, pequeño, no tiene dependencias y es multiplataforma. Incluye un diseño flexible, con soporte para complementos para Vim o Neovim. También incluye combinación de teclas y autocompletado.

Logo oficial del proyecto

Instalación de fzf en GNU/Linux

Su instalación es realmente sencilla y se puede hacer de diferentes maneras.

Si queremos tener la última versión solo hemos de clonar el repositorio utilizando git.

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

O bien utilizar nuestro gestor de paquetes favoritos, por ejemplo, si utilizamos Debian, Ubuntu o similares:

sudo apt install fzf

Podemos consultar todas las posibilidades de instalación desde su página del proyecto en Github

Trabajar con fzf

fzf iniciará el buscador interactivo, leerá la lista de STDIN y escribirá el elemento seleccionado en STDOUT.(Esto no lo digo yo lo indica en la propia página del proyecto) Veamos un ejemplo:

find * -type f -name "*.mp3" | fzf > selected

Con un resultado, si lanzo el comando desde una carpeta ubicada en mi colección de música:

Ejemplo básico de uso de fzf

También podemos utilizar directamente la herramienta sin combinarla con ninguna otra utilizando tuberías. Una vez dentro de esta nos encontraremos un poco perdidos. El uso básico es escribir una letra o letras, creando palabras que nos mostrará en los resultados. Por ejemplo, si escribimos simplemente «T«

Ejemplo de filtro básico

El programa incluye unas teclas y atajos de teclado, para movernos de forma cómoda:

  • CTRL-K, CTRL-J, (o bien CTRL-P, CTRL-N) para mover el cursor arriba o abajo.
  • ENTER para seleccionar el ítem, CTRL-C, CTRL-G o ESC para salir de la aplicación.
  • En el modo de selección múltiple (-m) , TAB y SHIFT-TAB para marcar varios elementos.
  • Utiliza combinaciones de teclas estilo emacs (editor del que ya os hablé)
  • Con el ratón: desplazarse, hacer clic, doble clic, ; shift-clic y shift-mayúsculas en el modo de selección múltiple.

Respecto al diseño, esto es, como se visualiza la aplicación. Por defecto se utiliza el tamaño total de la ventana (pantalla), pero podemos indicar el tamaño utilizando el parámetro «–height«, como sigue:

fzf --height 40%
# o bien
vim $(fzf --height 40%)

También podemos cambiar la visualización, para que en vez de ser de abajo hacia arriba, sea de arriba hacia abajo. Para ello debemos utilizar los parámetros «–reverse» y «--layaout«

fzf --height 40% --reverse
# o bien
vim $(fzf --height 40% --reverse)

Para muestra un botón:

Cambiamos el lugar donde se ubica el filtro

Podemos importar nuestras preferencias a las variables de entorno de nuestro usuario, por ejemplo:

export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

Sintaxis de búsqueda

Si no indicamos los contrario fzf utiliza la búsqueda extendida, que nos permite utilizar varios términos de búsqueda, delimitados por espacios, por ejemplo: ^music .mp3$ sbtrkt !fire

Algunos ejemplos:

  • test – Simplemente mostrará los resultados que coincidan con esta palabra exactamente.
  • lola – Cualquier elemento que acabe en lola.
  • ^música – Elementos que empiecen por música.
  • .mp3$ – Elementos que acaben en .mp3
  • !fuego – Elementos que no incluyan fuego.
  • ^!música – Elementos que no empiecen por música.
  • !.mp3$ – Elementos que no terminen en .mp3

Si no preferimos la coincidencia aproximada y no deseamos «citar» cada palabra, debemos iniciar fzf con la opción «-e» o «–exact«

Para terminar aplicamos algunos filtros:

Aplicamos algunos filtros

Esto es solo una pequeña aproximación a esta herramienta. Como siempre os recomiendo consultar la página del proyecto:

GitHub – fzf

También se puede consultar la excelente documentación de FZF para Arch:

fzf – ArchWiki