22 points par GN⁺ 2026-05-11 | 1 commentaires | Partager sur WhatsApp
  • Le fuzzy finder en ligne de commande fzf offre une valeur immédiate et singulière par rapport au temps investi, mais beaucoup de développeurs l’installent sans savoir comment l’utiliser puis l’abandonnent
  • Il peut remplacer la recherche d’historique Ctrl+R par du fuzzy matching avec aperçus multiples, ce qui corrige l’inconfort de l’ancienne recherche par correspondance exacte
  • Avec Alt+C, il devient possible de faire un cd flou même si l’on ne se souvient que vaguement du nom d’un répertoire, et de mettre en place un workflow permettant d’ouvrir instantanément un fichier avec la combinaison vi $(fzf)
  • En le connectant à ripgrep via un pipe, on peut effectuer une recherche floue sur toutes les lignes de tous les fichiers puis ouvrir directement le fichier correspondant dans son éditeur
  • C’est un outil qui améliore immédiatement la productivité, au point de faire vaciller même l’heuristique 80/20 qui recommande d’apprendre d’abord les outils Unix classiques (cat, grep, find, etc.)

La valeur que fzf apporte dès son installation

  • Les ingénieurs logiciel peuvent facilement créer des outils pour améliorer leur propre travail, mais passer d’un outil à l’autre sans en maîtriser certains en profondeur finit par coûter cher avec le temps
  • Une bonne heuristique 80/20 consiste à apprendre d’abord les anciens outils Unix comme cat, ls, cd, grep, cut, et, dans les rôles modernes d’administration système, cela inclut aussi sed et awk
  • fzf peut être vu comme une exception à cette heuristique, car son retour sur investissement est immédiat et sa valeur est unique
  • L’essentiel ici concerne les fonctionnalités utilisables immédiatement après l’installation via le script d’installation de fzf dans un environnement Ubuntu standard

L’effet immédiat des raccourcis par défaut

  • Ctrl+R : transformer l’historique des commandes en recherche floue

    • Sur la plupart des terminaux Linux et Windows, Ctrl+R fournit une recherche inversée dans l’historique des commandes
    • Le Ctrl+R par défaut exige une correspondance exacte pour retrouver la commande voulue et n’affiche qu’un seul aperçu à la fois, ce qui complique la recherche au moindre caractère manquant
    • Quand on installe fzf, plusieurs raccourcis clavier sont remplacés par de meilleurs comportements, et Ctrl+R est lui aussi nettement amélioré
    • Une installation via un gestionnaire de paquets comme apt peut ne pas fournir cette intégration des raccourcis, d’où l’intérêt d’utiliser le script d’installation de fzf
  • Alt+C : aller vite vers un répertoire dont le souvenir est flou

    • fzf transforme Alt+C en raccourci cd flou amélioré
    • Cela permet d’aller rapidement vers un répertoire quand on ne se rappelle plus du chemin exact mais seulement d’un nom approximatif
    • C’est pratique pour retrouver un dépôt ou un répertoire de travail peu visité depuis un terminal vide

La commande fzf elle-même et les combinaisons shell

  • fzf de base

    • Exécuter simplement la commande fzf lance une recherche floue sur les chemins de fichiers relatifs à partir du répertoire courant
    • Utilisé seul, cela sert surtout à choisir l’emplacement d’un fichier, donc l’intérêt reste limité
  • vi $(fzf)

    • Combiné à une substitution de commande comme vi $(fzf), on peut ouvrir directement dans l’éditeur le fichier choisi via la recherche floue
    • Cette méthode n’a rien de spécifique à vi et peut être utilisée avec l’éditeur de son choix, comme emacs, nano, code, etc.
  • vi $(find . '/' | fzf)

    • En combinant find . '/' | fzf avec un éditeur, on peut rechercher de façon floue parmi tous les chemins possibles et ouvrir un fichier de configuration dont on ignore l’emplacement
    • Pour trouver un fichier comme nginx.conf quand on ne se rappelle plus où il se trouve, au lieu d’essayer de deviner ou de mémoriser sa place à partir de la FHS, il suffit d’envoyer le résultat de find vers fzf
    • Une recherche comme conf$ permet de filtrer uniquement les lignes qui se terminent par conf
    • Si find rencontre beaucoup d’erreurs Permission denied, fzf peut vaciller un instant, mais il se rétablit après quelques secondes
    • Ce délai de quelques secondes est le compromis à accepter en échange de la simplicité extrême de cette façon de retrouver un fichier de configuration
  • vi **<TAB>

    • Une fonctionnalité mentionnée dans un commentaire Hacker News de sigmonsays se situe à mi-chemin entre le remplacement de raccourcis et l’exécution directe de fzf : la complétion floue avec double astérisque
    • vi **<TAB> permet de choisir un fichier d’une manière proche de vi $(fzf)
    • Il faut ensuite appuyer une fois de plus sur Enter pour lancer réellement la commande complétée
    • Cela fonctionne bien avec bash et zsh, mais peut ne pas marcher avec fish
    • Si la méthode avec appel explicite à $(fzf) est plus facile à retenir, on n’utilisera peut-être pas souvent cette fonctionnalité

Utiliser fzf aussi pour déplacer des fichiers

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) est utile quand on ne se souvient pas exactement de ce qu’il faut déplacer ni de l’endroit où le déplacer, mais qu’on a pour chaque élément des indices très précis
    • Le principe consiste à sélectionner en deux fois avec fzf l’élément à déplacer puis sa destination
    • Cela peut servir souvent pour déplacer et organiser des fichiers, par exemple lors de l’ajout de GIF dans un README GitHub
    • Comme exemple lié, l’article renvoie au README du mode interactif de finstem

Combiner avec rg pour une recherche floue dans le contenu des fichiers

  • rg : un grep rapide avec recherche récursive par défaut

    • La combinaison ci-dessous pourrait aussi se faire avec grep, mais rg ou ripgrep a l’avantage d’effectuer une recherche récursive par défaut, ce qui le rend particulièrement adapté à cet usage
    • Pour suivre les exemples, il est recommandé d’installer et d’utiliser rg
  • rg . | fzf

    • rg . produit en sortie chaque ligne des fichiers comme résultat de recherche, et en l’envoyant vers fzf, on peut effectuer une recherche floue sur toutes les lignes de tous les fichiers
    • On ne cherche alors plus à partir du nom de fichier, mais à partir d’un fragment de contenu présent dans le fichier
  • rg . | fzf | cut -d ":" -f 1

    • En ajoutant cut -d ":" -f 1 au résultat choisi avec rg . | fzf, on peut renvoyer le premier champ séparé par des deux-points, c’est-à-dire l’emplacement du fichier
    • Cette combinaison permet de rechercher flouement le contenu d’une ligne puis de ne récupérer que le chemin du fichier qui contient cette ligne
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) permet d’effectuer une recherche floue sur toutes les lignes de tous les fichiers, puis d’ouvrir dans vim le fichier contenant la ligne sélectionnée
    • C’est pratique quand on ne se souvient plus du nom du fichier mais seulement d’une partie de son contenu, tout en pouvant enchaîner directement vers l’éditeur

1 commentaires

 
GN⁺ 2026-05-11
Avis sur Lobste.rs
  • J’ai l’impression que le lecteur visé par cet article, c’est exactement moi. J’ai installé fzf, je me suis dit que c’était « génial », puis j’ai continué à oublier de l’utiliser ; maintenant, je me dis que je vais peut-être m’y mettre

    • L’essentiel, c’est de l’intégrer à sa configuration shell existante, à ses scripts perso et à ses alias. J’utilise fzf en permanence, mais je le lance presque jamais directement
  • Ça peut être un bon article, mais si l’objectif est de répondre à « et maintenant, qu’est-ce que j’en fais ? », commencer par l’intégration shell de fzf donne au contraire l’impression de ne s’adresser qu’à un public plus restreint
    J’utilise ctrl-r depuis longtemps dans bash, donc demander de le remplacer met la barre trop haut. J’aurais préféré qu’on commence par expliquer comment s’entraîner au même usage sans remplacer le comportement par défaut

    • En pratique, c’est plutôt un comportement par défaut amélioré. Le mieux est justement de le laisser remplacer ctrl-r, et la moitié de son intérêt vient du fait qu’on garde un geste déjà familier tout en obtenant une expérience plus riche, presque dans le même flux de travail
      ctrl-r est probablement la commande que j’utilise le plus, et fzf a été une amélioration immédiatement utile, sans courbe d’apprentissage. Comme il se lance avec ctrl-r, je n’oublie pas d’utiliser fzf. Cela dit, je suis ensuite passé à Fish shell, où ce même comportement est fourni par défaut
  • Convaincu. Je vais bientôt ajouter fzf avec l’intégration shell, et j’aurai appris quelque chose aujourd’hui

  • On peut aussi utiliser le raccourci ctrl-t pour trouver un fichier à insérer dans une commande. Je m’en sers souvent avec git pour choisir les fichiers à inclure dans une modification donnée, et je l’ai aussi utilisé après un grep pour réduire le périmètre de recherche

  • En dehors de l’amélioration de la recherche dans l’historique shell, j’utilise aussi fzf avec les deux alias suivants
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Je m’en sers surtout pour sélectionner les branches locales à supprimer après avoir fusionné des pull requests. Il existe peut-être une meilleure méthode, mais celle-ci ne m’a encore jamais fait défaut
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    Ça permet de changer rapidement AWS_PROFILE en fonction des valeurs présentes dans ~/.aws/config. Je me dis que je vais peut-être maintenant créer un alias similaire pour changer de namespace Kubernetes

  • Avec le plugin fzf.vim, on peut utiliser fzf dans vim. Pas seulement pour ouvrir des fichiers : on peut aussi faire de la recherche floue dans les buffers, l’historique des commandes, le contenu des fichiers, etc.

  • Mon usage principal de fzf consiste à parcourir et rechercher dans l’historique linéaire des commits Git pour comprendre ce qui a changé récemment
    Dans ma configuration Git par défaut, git fzf est défini comme ceci

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • J’ai l’impression de passer à côté de quelque chose. Je me demande pourquoi on installe fzf quand on ne sait même pas quoi en faire

  • Il y a aussi un article récent sur le sujet. Un utilisateur se sert de fzf comme sélecteur de fichiers pour jj
    https://lobste.rs/s/exlogg/jjj