← retour aux snippets

fzf: recherche fuzzy et ouverture dans l'éditeur

Trouver et ouvrir des fichiers instantanément (git, find), avec preview, multi-sélection et intégration éditeur.


objectif

Parcourir un dépôt ou un dossier et ouvrir rapidement des fichiers grâce à la recherche fuzzy, avec un aperçu du contenu, la multi-sélection et des intégrations utiles.

code minimal

# lister les fichiers git et ouvrir la sélection dans l'éditeur
git ls-files | fzf | xargs -r -n1 ${EDITOR:-vim}

utilisation

# preview du contenu (bat si dispo, sinon sed)
git ls-files \
  | fzf --preview 'command -v bat >/dev/null && bat --style=plain --color=always {} || sed -n "1,200p" {}'

# multi-sélection (Ctrl-Space) et ouverture en lot
git ls-files \
  | fzf -m --bind 'ctrl-a:select-all,ctrl-d:deselect-all' \
  | xargs -r ${EDITOR:-vim}

# rechercher aussi les fichiers non suivis (hormis .gitignore)
git ls-files --others --exclude-standard -co \
  | fzf | xargs -r ${EDITOR:-vim}

# chercher dans src/ avec fd (si installé), sinon find
(fd -t f . src || find src -type f) \
  | fzf --preview 'sed -n "1,120p" {}'

# ouvrir à la ligne correspondant à la recherche (neovim/vim)
match="$(rg -n --no-heading --color=never . | fzf --delimiter : --nth=3.. --preview 'sed -n {1..200} {1}' --preview-window=up:80%)"
file="$(cut -d: -f1 <<<"$match")"; line="$(cut -d: -f2 <<<"$match")"
[ -n "$file" ] && ${EDITOR:-vim} "+${line}" "$file"

# choisir un log de data.pm dans /var/log puis le suivre
find /var/log -type f -path "*/data.pm/*" -name "*.log" \
  | fzf --preview 'tail -n 200 {}' \
  | xargs -r -n1 tail -F

variante(s) utile(s)

# fzf-tmux en popup (si tmux): fenêtre centrée 80% hauteur
git ls-files | fzf-tmux -p 80%,80% --preview 'sed -n "1,200p" {}' \
  | xargs -r ${EDITOR:-vim}

# lire une liste NUL-terminée (noms tordus) avec --read0
find . -type f -print0 \
  | fzf --read0 --exit-0 --preview 'sed -n "1,120p" {1}'

# palette de branches git + checkout
git for-each-ref --format='%(refname:short) %(committerdate:relative)' refs/heads \
  | sort -k2 \
  | fzf --with-nth=1 --preview 'git log --oneline --decorate -n 20 -- {1}' \
  | awk '{print $1}' | xargs -r git checkout

# historique des commits: pick et ouvrir le diff
git log --oneline --decorate \
  | fzf --preview 'git show --color=always {1}' --ansi \
  | awk '{print $1}' | xargs -r -n1 git show

# choisir une URL et la tester (api.data.pm)
printf '%s\n' \
  "https://api.data.pm/health" \
  "https://api.data.pm/v1/users" \
  "https://data.pm/" \
  | fzf | xargs -r -n1 curl -fsS -I

notes

  • fzf lit par défaut des lignes séparées par newline; utilisez --read0 pour des listes NUL-terminées (find -print0).
  • --preview accepte une commande; {} ou {1} s’étend au chemin sélectionné. bat enrichit la preview si disponible.
  • -m active la multi-sélection; combinez avec --bind 'ctrl-a:select-all'.
  • fzf-tmux ouvre une UI dans tmux sans casser vos panes. Sinon, utilisez fzf classique.
  • intégrez rg (ripgrep) pour une recherche plein-texte ultra-rapide, puis sautez directement à la ligne dans l’éditeur.