fzf pour command line fuzzy finder… qui ne veut rien dire pour moi1 mais continuez de lire, c'est pratique.

First at all, ça s'installe d'un simple coup de apt install fzf.

Sur la page du projet, on peut voir que c'est un filtre unix qui peut utiliser toutes sortes de listes. Pas uniquement une liste de fichiers, mais aussi l'historique, une liste de processus, de noms de domaines…

fzf lit la liste à partir de l'entrée standard STDIN et affiche l'élément sélectionné (ou les éléments sélectionnés) sur la sortie standard (STDOUT).


find * -type f | fzf [-m]
fzf

cet exemple envoie la liste de tous les fichiers du répertoire courant (sans les fichiers cachés) à la commande fzf et la recherche peut commencer. Sans paramètre la commande fzf a ce comportement par défaut.

Par défaut le recherche est étendue (extended search mode) et se fait en entrant des mots séparés par des espaces. Certains caractères sont spéciaux et signifient : ^ au début de la chaine, $ à la fin, ! inverse et ' pour exact match.

Par exemple : ^music mp3$ 'exact oui !non retourne les éléments qui commence par « music », se termine par « mp3 », contiennent la chaine « exact », les lettres de « oui » et pas celles de « non ».

fzf-1.gif, juin 2021

  • [Up] et [Down] pour voyager dans la liste ;
  • [Enter] pour sélectionner l'élément ;
  • l'option -m permet de faire une recherche multiple. La sélection se fait avec la touche [Tab] et la validation avec [Enter] ;
  • l'option -e (exact match) désactive la recherche étendue.

Il est possible de faire une recherche dans l'historique tout aussi facilement


history | fsf +s --tac
  • +s ne trie pas la liste ;
  • --tac la montre dans l'ordre inverse.

Plutôt que d'envoyer sur STDOUT (ce qui n'est pas pratique), il est possible de rediriger la commande avec un bon vieil xargs :

fzf-2.gif, juin 2021

… ou d'utiliser un sous-shell vim -o $(fzf).

Plutôt que d'utiliser un sous-shell, il est possible d'utiliser **[Tab] pour lancer fzf à partir d'un répertoire.


vim /elsewhere/**[Tab]
cd /**[Tab]

fzf-4.gif, juin 2021

Pour que le lancement de fzf se fasse avec **[Tab], il faut éduquer bash en ajoutant ceci à son .bashrc.


source /usr/share/bash-completion/completions/fzf

La magie des deux étoiles fonctionne également pour une liste d'hôtes accédés en ssh ou pour des identifiants de processus (pid). Essayez:


ssh [Tab]
ssh **[Tab]
kill -9 [Tab]

Pour les personnes qui le préfèrent, il existe des touches de raccourcis (key binding) que l'on peut définir en incluant le fichier d'exemple (ou en écrivant le sien).


source /usr/share/doc/fzf/examples/key-bindings.bash

… par défaut [Ctrl-T] lancera fzf.

[Ctrl-r] remplacera la recherche dans l'historique par une recherche dans l'historique avec fzf. Beaucoup plus facile.

[Alt-c] permettra de faire un changement de répertoire (cd) vers le répertoire sélectionné par fzf.

Il est maintenant temps de s'occuper des paramètres que l'on peut passer à la commande. En voici quelques uns issus de la présentation officielle que je trouve pratiques.

  • --height 50% pour limiter la hauteur de fzf à 50% du terminal ;
  • --multi (-m) en mode multi-sélection ;
  • --inline-info pour gagner une ligne, la recherche et le nombre de fichiers se trouvent sur la même ligne ; 
  • --preview cat {} pour afficher une fenêtre de prévisualisation du fichier. La documentation propose un peu mieux avec:

    --preview '[[ $(file --mime {}) =~ binary ]] && echo {} is a binary file \
        || cat {} 2>/dev/null | head -300`
  • --preview-window='hidden' qui n'affiche pas la fenêtre de prévisualisation… heu !
  • --bind='f2:toggle-preview' qui associe à la touche [F2] l'affichage, ou pas, de la prévisualisation ;

fzf-5.gif, juin 2021

  • --bind='ctrl-a:select-all+accept en combinaison avec --multi bien sûr ;

…ce qui peut s'ajouter dans son fichier de configuration bash (ou autre shell):


export FZF_DEFAULT_OPTS="--height 50% \
    --multi \
    --inline-info \
    --preview '[[ \$(file --mime {}) =~ binary ]] \
        && echo {} is a binary file \
        || bat --color=always --style=plain,changes {} \
        2>/dev/null | head -300 ' \
    --preview-window='hidden' \
    --bind='f2:toggle-preview,ctrl-a:select-all+accept'"

Si l'on veut une prévisualisation d'un répertoire, cela peut se faire via : 


export FZF_ALT_C_OPTS="--preview 'tree -C {} | head -100'"

Si vous avez des tips and tricks, n'hésitez pas à les partager…


Sources, la page officielle du projet et la vidéo associée ainsi que cet article.
Crédit photo salihagir.


  1. deepl traduit fuzzy finder par « détecteur de fausses pistes » ou encore « chercheur de flou ».