notes·de·pit

Parfois j'apprends à pêcher à des gens qui n'aiment pas le poisson

fzf, fuzzy finder ou comment faire des recherches plus efficaces dans son terminal

98__magnifying_glass____vii_by_salihagir_d2nyby1-fullview.jpg, juin 2021

fzf pour command line fuzzy finder… qui ne veut rien dire pour moi 1 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

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

history | fsf +s --tac

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.

fzf-5.gif, juin 2021

…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 ».