Pourquoi vous devriez utiliser fzf, le fuzzy finder en ligne de commande

par Alexey Samoshkin

Missing demo found

Dans ce tutoriel, je vous aiderai à faire passer vos habitudes en ligne de commande à un niveau supérieur avec fzf . Commencez à rechercher des fichiers comme un pro. Apprenez des fonctionnalités moins connues, comme le changement de répertoire, la recherche dans l’historique d’une commande, la recherche du nom d’hôte auquel se connecter en SSH, la mise à mort d’un processus, l’aperçu instantané d’un fichier avec coloration syntaxique, et plus encore…

démo rapide

Aujourd’hui, je vais vous parler d’un outil qui peut changer votre vie technologique en parties « avant » et « après ». Croyez-moi, il ne s’agit pas d’une hyperbole. Voici fzf, qui signifie fuzzy finder. Comme le dit la définition, il s’agit d’un finisseur flou en ligne de commande à usage général. Cela ne semble pas très descriptif et attrayant pour ceux qui en entendent parler pour la première fois. Mais c’est un projet très populaire qui compte environ 21 000 étoiles sur Github. Il est donc temps de dissiper le brouillard et d’avoir un aperçu plus profond.

Ce billet accompagne ma récente screencast sur le sujet. Donc, si vous êtes une personne qui apprend en regardant, regardez-le. Sinon, regardez-le aussi ?, parce que les outils comme fzf sont mieux présentés avec une démo en direct plutôt que des tonnes de texte.

Comme la page du projet fzf n’a pas de vidéo de démonstration jusqu’à présent, j’ai appelé ce post « démo manquante trouvée ». Mais maintenant, cette vidéo a déjà été tirée dans le fzf repo et est devenue une partie du readme du projet.

Recherche de fichiers

Les personnes qui sont habituées à un environnement de ligne de commande sont probablement familières avec le concept de filtres Unix. C’est lorsque plusieurs utilitaires indépendants sont composés ensemble dans un pipeline pour produire la sortie désirée étape par étape. Par exemple, ce pipeline produit une liste de chaînes de caractères:

$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even

Chaque programme agit comme un filtre. En termes simples, fzf est juste un autre filtre Unix. Il lit les lignes de stdin, lance un dialogue interactif de recherche, et finalement écrit les éléments sélectionnés dans stdout. Le point clé et la différence avec des outils comme GNU find, est son dialogue de recherche interactif qui filtre les éléments instantanément au fur et à mesure que vous tapez.

« fzf » comme filtre Unix interactif

Cela peut ne pas sembler très pratique jusqu’à présent, mais le cas d’utilisation principal de fzf est de rechercher des fichiers sur la ligne de commande. Avec la correspondance floue et la rétroaction instantanée, vous n’êtes qu’à quelques caractères de trouver le bon fichier, peu importe à quel point il est perdu dans la hiérarchie des répertoires. Plus besoin de retourner dans votre gestionnaire de fichiers, de parcourir la hiérarchie des répertoires, de copier le chemin d’accès d’un fichier et de le coller dans le shell. Comparez les flux de travail « gestionnaire de fichiers » vs « fzf » ci-dessous.

fzf vs gestionnaire de fichiers comparaison

fzf prend en charge la correspondance floue, de sorte que vous pouvez simplement taper plusieurs caractères dans une rangée et il correspondra aux lignes avec ces caractères dispersés dans la chaîne. Alternativement, préfixez un terme de recherche avec un guillemet simple, comme 'string, pour opter pour des correspondances exactes uniquement, ou exécutez comme fzf --exact .

fuzzy vs correspondance exacte

Il ne prend pas en charge les expressions régulières ou les motifs globaux, donc le motif *.sh ne fonctionnerait pas. Mais restez simple – la productivité et la rapidité sont votre objectif aujourd’hui. Vous n’avez pas de temps libre pour composer et taper des expressions régulières correctes. Au lieu de cela, tapez simplement plusieurs mots, ou même des parties de mots, délimités par un espace, et cela couvrirait >90% des cas d’utilisation. Pour les 10% restants, use ^ and $ pour faire correspondre le début et la fin de la chaîne respectivement, et use ! pour annuler la correspondance.

fzf syntaxe de correspondance

Imprimer les fichiers sélectionnés sur une ligne de commande n’est pas super utile, donc généralement la recherche est combinée avec une autre action. Par exemple, vous pourriez l’ouvrir avec Vim, ou pipe les éléments sélectionnés vers le programme suivant.

# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l

Complétion floue pour bash et zsh

Pour le rendre plus pratique, la complétion floue peut être déclenchée si le mot avant le curseur se termine par la séquence de déclenchement qui est par défaut **. Par exemple, tapez vim ~/path/** et appuyez sur TAB . Voilà, fzf intervient!

Séquence de complétion floue en double étoile

** qui déclenche fzf finder et qui ressemble à * qui est pour l’expansion native du shell. À un certain moment, vous pourriez même oublier la présence de fzf et avoir l’impression qu’il s’agit d’une fonctionnalité native du shell.

Le format est le suivant, où FUZZY_PATTERN est optionnel.

COMMAND **<TAB>

Si vous n’aimez pas la séquence **, vous pouvez utiliser des raccourcis clavier. CTRL+T déclenche fzf et colle le fichier sélectionné sur la ligne de commande, tandis que ALT+C change dans le répertoire sélectionné.

Changement de répertoire

Ok, assez parlé de la recherche de fichiers. Parlons d’autres applications utiles. Changer votre répertoire de travail est une opération si commune. Mais néanmoins, je suis toujours un peu bloqué en essayant de me rappeler et de taper le bon chemin du répertoire, en faisant plusieurs erreurs en cours de route. Cela ralentit mon rythme. Même les compléments de zsh ne le compensent pas. Mais avec fzf, changer de répertoire est un jeu d’enfant, peu importe la profondeur et la distance. Il suffit de taper cd ** et vous y êtes presque.

changer de répertoire est comme un jeu d’enfant

Notez que pendant que fzf indexe votre arborescence de répertoires, vous pouvez commencer à chercher tout de suite. Le changement de répertoire est mon cas d’utilisation préféré, et la correspondance floue excelle vraiment ici. Il exige de vous le même effort pour changer un répertoire qu’il soit d’un niveau de profondeur ou de dix niveaux de profondeur.

ALT+C raccourci est un moyen alternatif de déclencher fzf dans un mode de changement de répertoire.

Historique des commandes

Vous utilisez peut-être le raccourci clavier Ctrl+R pour rechercher dans votre historique de commandes. Super, mais que diriez-vous de le surcharger avec fuzzy finder ? Regardez et comparez.

Recherche dans l’historique des commandes

Il colle l’élément sélectionné sur la ligne de commande, afin que vous puissiez le peaufiner.

Recherche du nom d’hôte pour SSH

Si vous êtes un développeur backend et que vous travaillez avec un certain nombre de serveurs distants, vous pourriez apprécier le combo ssh+fzf. Utilisez la même séquence de déclenchement à double étoile et tapez ssh ** . Il tire les adresses IP et les noms d’hôtes récemment utilisés de votre ~/.ssh/config et fait apparaître un finder interactif.

« fzf + ssh » combo

Envoyer un signal à un processus

Parfois nous voulons envoyer un signal à un processus, mais d’abord nous devons obtenir son PID par son nom. Habituellement on utilise pgrep <process_name> pour résoudre le PID suivi by a kill <process_pid> se référant à that PID. Avec fzf vous pouvez combiner les deux étapes steps. Type kill <TAB> et fzf en listant tous vos processus. Plus besoin de passer à un moniteur de processus dédié, comme « Activity Monitor » sur Mac.

Trouver un processus et envoyer un signal

Prévoir les fichiers pendant que vous cherchez

Supposons que vous cherchez des fichiers, mais parfois le nom du fichier lui-même ne vous en dit pas assez. Donc, vous pourriez vouloir jeter un coup d’œil sur le contenu d’un fichier pendant un moment pour prendre une décision. fzf vous couvre ici aussi.

Fenêtre d’aperçu

Par défaut, j’ai la fenêtre d’aperçu désactivée, mais je l’active quand je veux jeter un coup d’œil dans les fichiers. De plus, je l’ai amélioré avec une sortie colorée et une coloration syntaxique en utilisant bat comme commande d’aperçu.

Personnalisation

Il y a deux façons principales de personnaliser la version stock de fzf:

  • Changer le comportement du dialogue finder (fenêtre d’aperçu, raccourcis clavier, dimensions, actions personnalisées, etc). Voir la variable d’environnement FZF_DEFAULT_OPTS.
  • Change le backend de recherche sous-jacent. Par défaut, il utilise l’utilitaire GNU find, mais vous pouvez passer aux outils plus avancés comme fd ou ripgrep. Premièrement, c’est plus rapide que l’utilitaire find de stock. Ensuite, ces outils respectent les règles .gitignore, vous n’obtiendrez donc pas de fichiers node_modules ou .git dans vos résultats de recherche. Vous pouvez également utiliser git ls-tree pour lister les fichiers lorsque vous êtes dans un repo Git. Voir la variable d’environnement FZF_DEFAULT_COMMAND.

La configuration se fait par le biais des variables d’environnement. Voici le snippet de ma configuration. Pas sûr qu’il fonctionnerait tel quel lors d’un copier-coller, il y a très probablement d’autres dépendances manquantes. Mais c’est juste pour vous donner une idée de ce à quoi ressemble la configuration.

Fzf et Vim

Jusqu’à présent, nous avons vu l’utilisation en ligne de commande uniquement. Mais fzf est également expédié comme un plugin Vim. Et croyez-moi, si vous êtes un Vimmer, cela vaut la peine de l’ajouter à votre vimrc. L’utilisation de Vim n’entre pas dans le cadre de ce billet, sinon personne ne le lirait ? Mais j’en parle en détail dans la deuxième partie de ma vidéo, également liée au début du billet.

Si vous êtes impatient, voici un petit extrait pour attirer votre attention. Utilisez la commande :grep pour la recherche de texte à l’échelle du projet, ouvrez les correspondances dans la fenêtre fzf en mode plein écran, filtrez davantage les correspondances dans fzf, et sautez à la correspondance sélectionnée. Et n’oubliez pas l’aperçu instantané du fichier à la position précise de la ligne. C’est génial, n’est-ce pas ?

fzf ❤️ vim

Conclusion

J’espère que vous êtes impressionné de la façon dont fzf est super génial. Il y a de fortes chances que vous soyez déjà prêt à l’installer et à l’essayer.

N’oubliez pas que fzf n’est pas seulement pour la recherche de fichiers, bien que ce soit sa fonctionnalité principale. Comme vous pouvez le voir, « recherche + action » est un principe général, mais il est assez abstrait et puissant pour travailler avec n’importe quel type de liste : fichiers, répertoires, processus, noms d’hôtes, etc. Rappelez-vous au début de ce post – fzf est juste un filtre Unix. Libérez votre imagination, nourrissez-le de n’importe quelle liste, et adaptez-le à vos propres besoins. Vous pourriez vous inspirer d’une foule d’exemples.

BTW, appréciez à quel point la philosophie Unix est supérieure. fzf est un excellent exemple d’un programme qui adhère à ces principes.

  • Laissez le programme pour faire une chose et le faire bien (principe de responsabilité unique)
  • faites-le assez abstrait pour être agnostique des détails non pertinents ou des types de données
  • composez des programmes individuels séparés en utilisant des interfaces standard bien définies.

S’en tenir à ces principes dans votre carrière de développement de logiciels. Connaître les principes fondamentaux qui se tiennent derrière la naissance et la mort rapide de multiples outils, langages et frameworks là-bas est ce qui différencie les développeurs professionnels des amateurs.

Ressources

junegunn/fzf : Un fuzzy finder en ligne de commande – https://github.com/junegunn/fzf

Un univers Vim. fzf – fuzzy finder en ligne de commande – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Ma chaîne Youtube. Il n’y a que quelques vidéos, car je fais mes premiers pas dans la réalisation de screencasts. Soyez patient, je promets de faire plus de vidéos. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd : Une alternative simple, rapide et conviviale à ‘find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep : ripgrep recherche récursivement des répertoires pour un motif regex – https://github.com/BurntSushi/ripgrep

junegunn/fzf.vim : fzf vim – https://github.com/junegunn/fzf.vim

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.