1 points par GN⁺ 4 시간 전 | 1 commentaires | Partager sur WhatsApp
  • fzf amé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 find vers fzf, 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 aussi sed et awk
  • fzf peut ê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 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

    • Dans la plupart des terminaux Linux et Windows, Ctrl+R fournit une recherche arrière dans l’historique des commandes
    • Le Ctrl+R par 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 fzf installé, plusieurs raccourcis clavier sont remplacés par de meilleurs comportements, et Ctrl+R est lui aussi largement amélioré par rapport à la méthode d’origine
    • Une installation via un gestionnaire de paquets comme apt peut ne pas inclure cette intégration des raccourcis, d’où l’intérêt d’utiliser le script d’installation de fzf
  • Alt+C : aller vite dans un répertoire dont le souvenir est flou

    • fzf transforme Alt+C en raccourci cd flou 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

  • fzf de base

    • Exécuter simplement la commande fzf lance 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
  • 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 à vi et peut aussi être utilisée avec l’éditeur de votre choix, comme emacs, nano ou code
  • vi $(find . '/' | fzf)

    • En combinant find . '/' | fzf avec 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.conf dont vous ne vous souvenez plus de l’emplacement, il suffit d’envoyer le résultat de find vers fzf au 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 par conf
    • Si find rencontre beaucoup d’erreurs Permission denied, fzf peut 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
  • 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 de fzf
    • vi **<TAB> peut servir à choisir un fichier de manière proche de vi $(fzf)
    • Il faut ensuite appuyer encore une fois sur Enter une 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é

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 fzf deux 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 : un grep rapide avec recherche récursive par défaut

    • La combinaison ci-dessous est aussi possible avec grep, mais rg, ou ripgrep, 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
  • rg . | fzf

    • rg . 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 1 au résultat choisi via rg . | 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
  • 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 dans vim le 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

 
GN⁺ 4 시간 전
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