← Blog

La comanda fzf(1)


2021-11-13

La comanda fzf(1) és un "fuzzy finder" interactiu. La utilitzo cada dia i m'estalvia molt de temps, per tant, m'és imprescindible.

  $ fzf

Si l'invoques directament (no és el més habitual), buscarà els noms dels arxius dins la carpeta actual (i també les subcarpetes). S'obrirà un camp de text on es mostraran els resultats que s'ajustin més al que estàs escrivint a temps real. Un cop filtrats els resultats, apretes la tecla Enter amb la opció seleccionada, i s'acaba el programa. El resultat del procés és el nom que has seleccionat després de la cerca. Pot semblar extrany que no faci res més, però que sigui exactament així és precisament el que fa que sigui tan potent, ja que permet acoplar-hi qualsevol altra comanda. Per exemple, si vols editar un fitxer amb l'editor de text vim(1) però no recordes la ruta sencera i/o el nom de l'arxiu que estàs buscant, pots fer que fzf busqui l'arxiu al mateix moment que obres el vim, de la següent manera:

  $ vim `fzf`

D'aquesta manera pots obrir qualsevol fitxer dins la carpeta on estiguis en qüestió de milisegons. És tan útil que val la pena tenir-la mapejada a un alias, com per exemple:

  $ alias vimf='vim `fzf`'
nota: guarda la línia anterior dins el fitxer ~/.bashrc per tenir l'alias disponible sempre.

Així, navegues fins l'arrel d'un projecte amb la comanda cd i simplement invoques l'alias vimf i escriu algunes lletres que recordis del nom del fitxer que busques, prems Enter i ja l'estàs editant:

  $ vimf

La comanda fzf també accepta entrada de text per pipes (stdin), és a dir, pots buscar dins de qualsevol llista que li subministris. Per exemple, imagina que vols buscar alguna llibreria de C (com ara stdio.h) dins la carpeta /usr/include però no recordes exactament el nom i vols poder filtrar dins la llista de noms que estan dins la carpeta. Invoques la següent comanda i escrius "std" per veure si trobes la ruta sencera de la llibreria stdio.h:

  $ less `find /usr/include | fzf`

Immediatament has trobat la ruta sencera a l'arxiu que buscaves i has mirat dins l'arxiu amb la comanda less per fer-hi un cop d'ull ràpid.

Un altre exemple: imagina que tens un arxiu anomenat langs.txt amb una llista de llenguatges de programació que vols aprendre:

  $ cat langs.txt
  javascript
  python
  C
  rust
  go
  matlab
  java
  ruby
  perl

La següent comanda permet seleccionar de forma interactiva un dels noms de la llista i buscar un manual dins la web cheat.sh sense haver de sortir del terminal:

  $ curl cheat.sh/`cat langs.txt | fzf`

La comanda fzf també porta inclosa una integració dins de vim, en forma de plugin: la funció :FZF permet obrir ràpidament un fitxer sense haver de sortir de vim, de manera que navegar ràpidament entre fitxers sembla màgia.

Si fas servir vim-plug, afegeix aquestes línies al .vimrc:

  Plug 'junegunn/fzf',{'dir':'~/.fzf','do':'./install --all'}

  "exemple de mapping de la funció :FZF"
  nnoremap ,f :FZF

I així és com l'utilitzo en el meu dia a dia.

Instal·lació:

  # GNU Linux (Debian i derivats)
  $ sudo apt install fzf

  # Mac OS X
  $ brew install fzf

Manual:

  $ man fzf

Tota la info sobre fzf i més exemples útils: https://github.com/junegunn/fzf

Salut!

Lluís