TopGit
GitHub Repo Review

fzf Fuzzy Finder: Fast File & Command Picker

FTopGit review image for junegunn/fzf
Review by Topgit.dev for junegunn/fzf, with GitHub repository stats and README context.
Quick verdict

fzf earns a spot in your dotfiles the day you get tired of tab-completing long paths or scrolling through shell history by hand. Install it once, wire up the CTRL-T/CTRL-R/ALT-C bindings, and a good chunk of your file and history navigation moves through one fuzzy-match prompt instead of ls, cd, and history piped through grep.

Stars
★ 83.2k
Forks
⑂ 3.3k
Contributors
👥 338
Language
Go
License
MIT
Topic
Developer Tools
Updated
Sep 2026
Homepage
GitHub

What is fzf?

fzf is a command-line fuzzy finder written in Go that reads a list of items — files, command history, running processes, whatever you pipe into it — and lets you narrow it down by typing a few loosely matching characters instead of a full name. It runs as an interactive terminal program that writes your selection back to STDOUT, so any shell script or key binding can use it as a picker.

The problem fzf solves

Terminal workflows are full of moments where you know roughly what you want but not its exact spelling: a file three directories down, a git branch from last sprint, a shell command from an hour ago. Tab completion isn't enough. It needs the exact prefix, and `history | grep` needs an exact substring in the right place. fzf solves the 'I remember it approximately' problem by matching characters in order anywhere in the string, then handing the one line you picked back to whatever command is waiting for it.

Core features

  • Single portable binary — no interpreter or package dependency required to run it.
  • Extended search syntax: fuzzy, 'exact, ^prefix, suffix$, and !negated terms combinable in one query, plus a `|` OR operator.
  • Shell integration adds CTRL-T (files/dirs), CTRL-R (command history), and ALT-C (cd) key bindings, plus ** fuzzy completion, to Bash, Zsh, Fish, and Nushell.
  • Event-driven `--bind` actions (reload, become, transform-header, transform-preview-label) turn a query into a small terminal UI.
  • Three display modes: fullscreen, an inline `--height` panel, and a `--popup` window on tmux 3.3+ or Zellij 0.44+.
  • Style presets (default, full, minimal) plus per-element `--color` and `--preview` options for the finder window.
  • Official Vim/Neovim plugin (`fzf#install()`) keeps the bundled binary in sync with your plugin manager.
  • Handles lists with millions of entries, per the README, without a noticeable lag opening the finder.
How this repository's GitHub stars have grown over time. Source: star-history.com.View the star history

Installing fzf

fzf's README documents several install paths. On macOS or Linux, `brew install fzf` via Homebrew is the fastest; `mise use -g fzf@latest` works if you already manage tool versions with mise. Linux users can pull it from their distro's own package manager — APT, DNF, Pacman, APK, Zypper, XBPS, Portage, Nix, Conda, Spack, pkg, pkgin, and pkg_add are all listed in the README's package table. On Windows, it's available through Chocolatey, Scoop, Winget, or MSYS2's pacman. You can also `git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install`, which adds the shell integration lines for you, or grab a binary straight from the GitHub releases page. Whichever path you pick, shell integration (the key bindings and fuzzy completion) is a separate step — the README has you add one eval/source line per shell after installing the binary.

Basic usage

Basic usage is a Unix pipe: `find * -type f | fzf > selected` filters a file list and writes your pick to STDOUT. Run fzf with no pipe and it walks the current directory itself, so `vim $(fzf)` opens whatever file you fuzzy-select. Inside the finder, CTRL-J/CTRL-K (or CTRL-N/CTRL-P) move the cursor, Enter selects, and CTRL-C/CTRL-G/ESC exits; add `-m` for multi-select with TAB and Shift-TAB, and the mouse works for scrolling and clicking too. The default file-walking behavior is overridable via `$FZF_DEFAULT_COMMAND` or the `--walker` family of options. For filenames with odd characters, the README recommends `fzf --print0 | xargs -0 -o vim` over plain interpolation. There's also `--bind 'enter:become(vim {})'`, which replaces the fzf process with the chosen command entirely instead of shelling out to it.

Common use cases

  • Checking out a git branch: pipe `git branch` into fzf and pick from the list instead of typing the full name.
  • Re-running a past shell command fast via CTRL-R instead of scrolling through `history`.
  • Opening a file in Vim with `vim $(fzf)` instead of tab-completing a long path.
  • Killing a runaway process by fuzzy-matching its name with `kill -9 **<TAB>` instead of grepping `ps aux`.
  • Building a custom terminal menu with `--bind` and `--preview` — picking a docker container or ssh host from a generated list.

Why developers use fzf

  • Works everywhere you already have a shell — Bash, Zsh, Fish, and Nushell all get key bindings and completion from the same binary.
  • The search syntax combines fuzzy, exact, prefix, suffix, and negated terms in one query instead of a separate regex step.
  • `--bind` turns fzf into a small event-driven UI toolkit — previews, custom headers, and reload actions without leaving the terminal.
  • Ships as a single portable binary, so there's no runtime or dependency chain to install before it works.
  • CTRL-T, CTRL-R, and ALT-C give you file, history, and directory search on the command line as soon as shell integration is set up.

Limitations and tradeoffs

  • The Vim integration is split across two separate plugins (fzf and fzf.vim), so Neovim users who want Lua-native config typically end up installing fzf-lua instead.
  • Customizing `--bind`, `--preview`, and `--style` together gets verbose fast — the README's own 'full' preset example chains a dozen options.
  • CTRL-R's custom command override isn't supported yet; setting a non-empty `FZF_CTRL_R_COMMAND` just prints a warning.
  • Out of the box, file search falls back to walking the filesystem — you have to set `$FZF_DEFAULT_COMMAND` yourself to point it at something faster like a file indexer.
View on GitHubHomepage

Alternatives to fzf

skim — a fuzzy finder with fzf-compatible key bindings, written in Rust instead of Go.fzy — a smaller, single-purpose fuzzy matcher for the terminal with no shell-integration layer of its own.peco — an interactive filtering tool for the command line with a similar pipe-in, select, pipe-out model.

Frequently asked questions

Is fzf free and open source?

fzf is free and open source, released under the MIT license, so you can use, modify, and redistribute it without paying for a license or dealing with usage restrictions.

What shells does fzf support?

fzf ships official integration scripts for Bash, Zsh, Fish, and Nushell, adding key bindings and fuzzy completion to each. Any POSIX-compatible shell can also call the fzf binary directly without the extra integration.

Can I use fzf with Neovim?

fzf works with Neovim through the official junegunn/fzf.vim plugin, installed alongside the fzf plugin itself via vim-plug. Neovim users who prefer Lua-based configuration can use fzf-lua instead, which the fzf README points to directly.

How do I preview files in fzf?

fzf shows previews through the `--preview` option, which runs a shell command against the highlighted line and displays its output in a side pane, for example `--preview 'bat -n --color=always {}'` to preview file contents.

Does fzf work on Windows?

fzf runs on Windows and installs through Chocolatey, Scoop, Winget, or MSYS2, according to the project's README. Binary releases are also available directly from the fzf GitHub releases page for manual installation.

How do I disable specific fzf key bindings?

fzf key bindings are disabled by setting the matching *_COMMAND variable to an empty string before sourcing the shell integration script — for example, `FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --bash)"` turns off CTRL-R and ALT-C while keeping CTRL-T.

Who should try it — and who should skip

Install fzf if you spend real time in a terminal and already lean on shell history or `find`/`grep` to locate things — the CTRL-R and CTRL-T bindings pay for themselves within a day. Skip it if you work mostly through a GUI file manager and IDE search, where a terminal fuzzy finder doesn't intersect your workflow, or if you're not willing to edit your shell's rc file to wire up the integration.

Related repositories

Source & attribution

Based on the junegunn/fzf GitHub repository (github.com/junegunn/fzf) and its README.

GitHub data · last synced Aug 14, 2026Reviewed by Henry
Back to TopGit

Still deciding about fzf?

One click hands the question to an AI along with this page — see what it says about fzf.

GitHub