J’ai installé `fzf`. Et maintenant, qu’est-ce que je dois faire ? (2023)
(andrew-quinn.me)fzfaméliore dès l’installation la recherche dans l’historique des commandes avec Ctrl+R grâce à la recherche floue- Alt+C permet de revenir rapidement à un ancien répertoire de travail sans connaître son chemin exact
- La commande
fzf, combinée à la substitution de commande, permet d’ouvrir directement le fichier sélectionné avec vi, emacs ou code - En envoyant le résultat de
findversfzf, il devient plus facile de retrouver des fichiers de configuration dont on ignore l’emplacement, comme nginx.conf - rg. | fzf permet d’ouvrir le bon fichier à partir d’un indice trouvé dans son contenu, plutôt qu’à partir de son nom
La valeur qu’on obtient immédiatement après avoir installé fzf
- Les ingénieurs logiciel peuvent facilement créer des outils pour améliorer leur propre travail, mais le coût augmente avec le temps si l’on saute d’un outil à l’autre sans jamais en maîtriser certains en profondeur
- Une bonne heuristique 80/20 consiste à d’abord apprendre les anciens outils Unix comme
cat,ls,cd,grep,cut; dans des rôles modernes d’administration système, cela inclut aussisedetawk fzfpeut être vu comme une exception à cette heuristique, car son effet est immédiat par rapport à l’investissement nécessaire et sa valeur est assez unique- L’essentiel, ce sont les fonctionnalités disponibles juste 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- Dans la plupart des terminaux Linux et Windows,
Ctrl+Rfournit une recherche arrière dans l’historique des commandes - Le
Ctrl+Rpar défaut exige une correspondance exacte pour retrouver la commande voulue et ne montre qu’un seul aperçu à la fois, ce qui rend la recherche difficile au moindre caractère erroné - Une fois
fzfinstallé, plusieurs raccourcis clavier sont remplacés par de meilleurs comportements, etCtrl+Rest lui aussi largement amélioré par rapport à la méthode d’origine - Une installation via un gestionnaire de paquets comme
aptpeut ne pas inclure cette intégration des raccourcis, d’où l’intérêt d’utiliser le script d’installation defzf
- Dans la plupart des terminaux Linux et Windows,
-
Alt+C: aller vite dans un répertoire dont le souvenir est floufzftransformeAlt+Cen raccourcicdflou amélioré- Cela permet de se déplacer rapidement quand on ne se souvient pas du chemin exact d’un répertoire, mais seulement d’une partie de son nom
- C’est utile pour retrouver, depuis un terminal vide, un dépôt ou un répertoire de travail qu’on n’a pas visité depuis longtemps
La commande fzf elle-même et sa combinaison avec le shell
-
fzfde base- Exécuter simplement la commande
fzflance une recherche floue dans les chemins relatifs des fichiers à partir du répertoire courant - Utilisée seule, elle sert surtout à choisir l’emplacement d’un fichier, donc son utilité reste limitée
- Exécuter simplement la commande
-
vi $(fzf)- Combinée à la substitution de commande comme dans
vi $(fzf), elle permet d’ouvrir directement dans l’éditeur le fichier choisi par recherche floue - Cette approche n’a rien de spécifique à
viet peut aussi être utilisée avec l’éditeur de votre choix, commeemacs,nanooucode
- Combinée à la substitution de commande comme dans
-
vi $(find . '/' | fzf)- En combinant
find . '/' | fzfavec un éditeur, on peut ouvrir par recherche floue, parmi des chemins complets, un fichier de configuration dont on ne connaît pas l’emplacement - Pour retrouver un fichier comme
nginx.confdont vous ne vous souvenez plus de l’emplacement, il suffit d’envoyer le résultat defindversfzfau lieu d’essayer de deviner ou de mémoriser sa place à partir de vos connaissances du FHS - Une recherche comme
conf$permet de filtrer uniquement les lignes qui se terminent parconf - Si
findrencontre beaucoup d’erreursPermission denied,fzfpeut hésiter un instant, mais il se rétablit après quelques secondes - Ces quelques secondes de latence sont le compromis à accepter en échange d’une manière très simple de retrouver un fichier de configuration
- En combinant
-
vi **<TAB>- Fonctionnalité mentionnée dans un commentaire Hacker News de
sigmonsays, cette complétion floue avec deux astérisques se situe à mi-chemin entre le remplacement de raccourcis et l’exécution directe defzf vi **<TAB>peut servir à choisir un fichier de manière proche devi $(fzf)- Il faut ensuite appuyer encore une fois sur
Enterune fois la commande réellement complétée - Cela fonctionne bien dans bash et zsh, mais peut ne pas fonctionner dans
fish - Si la méthode avec appel explicite à
$(fzf)vous paraît plus facile à retenir, vous n’utiliserez peut-être pas souvent cette fonctionnalité
- Fonctionnalité mentionnée dans un commentaire Hacker News de
Utiliser aussi fzf 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ù l’envoyer, mais qu’on garde pour chacun un indice très précis- Le principe consiste à choisir avec
fzfdeux fois : une fois l’élément à déplacer, une fois la destination - Cela peut devenir un réflexe pour déplacer et organiser des fichiers, par exemple lors de l’ajout de GIF dans un README GitHub
- Voir aussi, comme exemple lié, le README du mode interactif de
finstem
Recherche floue jusque dans le contenu des fichiers avec rg
-
rg: ungreprapide avec recherche récursive par défaut- La combinaison ci-dessous est aussi possible avec
grep, maisrg, ouripgrep, est particulièrement adapté à cet usage car la recherche récursive y est activée par défaut - Pour reproduire les exemples, il est recommandé d’installer et d’utiliser
rg
- La combinaison ci-dessous est aussi possible avec
-
rg . | fzfrg .renvoie en résultat de recherche chaque ligne des fichiers ; en l’envoyant àfzf, on peut faire une recherche floue parmi toutes les lignes de tous les fichiers- On cherche alors à partir du contenu d’une ligne dans un fichier, plutôt qu’à partir du nom du fichier
-
rg . | fzf | cut -d ":" -f 1- En ajoutant
cut -d ":" -f 1au résultat choisi viarg . | fzf, on récupère le premier champ séparé par des deux-points, c’est-à-dire l’emplacement du fichier - Cette combinaison permet donc de faire une recherche floue sur 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 de faire une recherche floue dans 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 pas du nom du fichier, mais seulement d’une partie de son contenu, et qu’on veut enchaîner immédiatement 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