URL: https://linuxfr.org/users/anaseto/journaux/chercher-des-repertoires-bookmark-avec-un-fuzzy-finder Title: Chercher des répertoires bookmark avec un fuzzy finder Authors: anaseto Date: 2017年02月04日T18:32:11+01:00 License: CC By-SA Tags: Score: 7 Bonjour Nal, connais-tu [fzf](https://github.com/junegunn/fzf) ? C'est un outil en ligne de commande qui permet de sélectionner rapidement une ligne dans un fichier : on tape juste quelques caractères et une heuristique associe un score à chaque ligne, nous présentant en premier la ligne faisant le meilleur score. Il y a d'autres outils semblables (`fzy`, `pick`, etc.), et il y a souvent des versions intégrées dans les éditeurs de textes comme vim ou emacs pour chercher des fichiers, buffers, tags, ou bien dans les navigateurs pour chercher dans l'historique ou les bookmarks. Du coup, comme j'aime bien les bookmarks, j'ai fait une petite fonction shell appelée `d` qui permet de se déplacer dans un dossier bookmarqué en utilisant `fzf`. En pratique pour bookmarquer le dossier courant, ça donne : ```sh $ d b ``` Et pour se déplacer dans un dossier : ```sh $ d ``` La fonction n'est pas très longue : ``` sh # USAGE: d [b] # # The function jumps to bookmarked directory selected by user with fzf. If # argument "b" is provided, current directory is bookmarked. # # The D_BOOKMARKS variable can be set to control bookmarks file location. The # D_FUZZY_FINDER variable can be set to use a custom fuzzy finder (default is # "fzf"). # # The bookmarks file is kept sorted by usage, to allow easy removal by hand of # unused bookmarks. # # Install: just source this file in your shell rc file. d() { local cmd="1ドル" local bookmarks_file="${D_BOOKMARKS:-"$HOME/.d_bookmarks"}" local lock_file="${bookmarks_file}.lock" local file if [ "$cmd" == "b" ]; then file="$(pwd)" elif [ -n "$cmd" ]; then echo "d: unknown argument: '$cmd'. Expected 'b' or no argument.">&2 return 1 else file="$(<"$bookmarks_file" ${D_FUZZY_FINDER:-fzf})" fi if [ ! -d "$file" ]; then return fi cd "$file" || { echo "d: could not enter '$file' directory">&2 return 1 } if mkdir "$lock_file"> /dev/null 2>&1; then # create bookmarks file if it does not exist touch "$bookmarks_file" # put $file at the end of the bookmarks file, # to keep it sorted by last time usage. perl -i.back -ne 'BEGIN{$f = quotemeta(shift);} print unless /^$f$/;' \ "$file" "$bookmarks_file" && print -r -- "$file">> "$bookmarks_file" || echo "d: something went wrong updating bookmarks file">&2 rmdir "$lock_file" || { echo "d: could not remove lock file '$lock_file'">&2 return 1 } else echo "d: lock file $lock_file already present">&2 return 1 fi } ``` Et puis, comme j'aime bien aussi l'idée de `xdg-open` pour ouvrir des fichiers en tapant toujours la même commande, j'ai fait un petit script (il s'appelle `o` celui-ci), qui va utiliser `fzf` pour sélectionner un fichier à ouvrir. Le script essaie de pas être trop bête et, si le répertoire courant est un dépôt git, il utilisera par exemple `git ls-files` pour récupérer la liste. S'il semble y avoir trop de fichiers, il limite la profondeur de recherche. En pratique, c'est normalement : ```sh $ o ``` Ou, si on veut préciser un répertoire dans lequel effectuer la recherche autre que le répertoire courant : ```sh $ o dossier ``` Au final, en combinant les deux, j'évite une bonne partie des `cd` et itérations à coups de `` pour me déplacer et ouvrir des fichiers. Le script `o` est un peu plus long, du coup j'ai mis les deux scripts [ici](https://github.com/anaseto/scripts). En cherchant un peu, j'ai trouvé un ou deux trucs un peu similaires comme [ceci](https://github.com/urbainvaes/fzf-marks) pour bash et zsh. J'ai testé mes scripts qu'avec ksh sous OpenBSD, mais a priori ils devraient fonctionner aussi avec bash ou zsh. Et vous, avez-vous aussi des astuces similaires à partager ?

AltStyle によって変換されたページ (->オリジナル) /