J’ai installé `fzf`. Et maintenant, qu’est-ce que j’en fais ? (2023)
(andrew-quinn.me)- Le fuzzy finder en ligne de commande
fzfoffre 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+Rpar 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 combinaisonvi $(fzf) - En le connectant à
ripgrepvia 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 aussisedetawk fzfpeut ê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
fzfdans 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+Rfournit une recherche inversée dans l’historique des commandes - Le
Ctrl+Rpar 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, etCtrl+Rest lui aussi nettement amélioré - Une installation via un gestionnaire de paquets comme
aptpeut ne pas fournir cette intégration des raccourcis, d’où l’intérêt d’utiliser le script d’installation defzf
- Sur la plupart des terminaux Linux et Windows,
-
Alt+C: aller vite vers un répertoire dont le souvenir est floufzftransformeAlt+Cen raccourcicdflou 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
-
fzfde base- Exécuter simplement la commande
fzflance 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é
- Exécuter simplement la commande
-
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 à
viet peut être utilisée avec l’éditeur de son choix, commeemacs,nano,code, etc.
- Combiné à une substitution de commande comme
-
vi $(find . '/' | fzf)- En combinant
find . '/' | fzfavec 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.confquand 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 defindversfzf - Une recherche comme
conf$permet de filtrer uniquement les lignes qui se terminent parconf - Si
findrencontre beaucoup d’erreursPermission denied,fzfpeut 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
- En combinant
-
vi **<TAB>- Une fonctionnalité mentionnée dans un commentaire Hacker News de
sigmonsaysse situe à mi-chemin entre le remplacement de raccourcis et l’exécution directe defzf: la complétion floue avec double astérisque vi **<TAB>permet de choisir un fichier d’une manière proche devi $(fzf)- Il faut ensuite appuyer une fois de plus sur
Enterpour 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é
- Une fonctionnalité mentionnée dans un commentaire Hacker News de
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
fzfl’é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: ungreprapide avec recherche récursive par défaut- La combinaison ci-dessous pourrait aussi se faire avec
grep, maisrgouripgrepa 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
- La combinaison ci-dessous pourrait aussi se faire avec
-
rg . | fzfrg .produit en sortie chaque ligne des fichiers comme résultat de recherche, et en l’envoyant versfzf, 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 1au résultat choisi avecrg . | 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
- En ajoutant
-
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 dansvimle 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
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
Ç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
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-tpour trouver un fichier à insérer dans une commande. Je m’en sers souvent avecgitpour choisir les fichiers à inclure dans une modification donnée, et je l’ai aussi utilisé après ungreppour réduire le périmètre de rechercheEn dehors de l’amélioration de la recherche dans l’historique shell, j’utilise aussi
fzfavec les deux alias suivantsalias 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 KubernetesAvec 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 fzfest défini comme ceciJ’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