fzf — Trivia & Interesting Facts¶
Surprising, historical, and little-known facts about fzf, the fuzzy finder.
fzf was originally written in Ruby¶
Junegunn Choi first wrote fzf in Ruby in 2013. He rewrote it in Go in 2015 (version 0.9.0) because the Ruby version was too slow for large inputs. The Go rewrite was approximately 10x faster and eliminated the Ruby runtime dependency. The single-binary distribution model was a key reason for choosing Go.
The fuzzy matching algorithm is more sophisticated than it looks¶
fzf uses a modified Smith-Waterman algorithm, which originates from bioinformatics (DNA sequence alignment). The algorithm assigns different scores based on match position (beginning of word, after separator, consecutive characters) to produce intuitive rankings. A match at a word boundary scores higher than one mid-word.
Ctrl+R replacement is fzf's killer app¶
The most popular fzf use case — replacing Bash's built-in Ctrl+R reverse history search — was not the original goal. Choi initially built fzf as a general-purpose filter. The shell history integration was added later but became so popular that many users install fzf exclusively for this feature. The default Ctrl+R shows the last ~500 commands; fzf searches your entire history file (often 10,000+ entries) with instant fuzzy matching.
fzf has a built-in tmux integration¶
Running fzf-tmux (or fzf --tmux) opens the finder in a tmux split pane instead of taking over the current terminal. This seemingly small feature enables workflows where you can see both the fuzzy finder and your current context simultaneously. It was added because Choi himself is a heavy tmux user.
The preview window changed everything¶
fzf 0.16.0 (2017) added --preview, which runs a command for the currently highlighted item and displays its output in a side panel. This single feature transformed fzf from a simple selector into a full file browser, git log explorer, and process manager. fzf --preview 'bat --color=always {}' is now one of the most common CLI power-user commands.
fzf processes millions of lines without breaking a sweat¶
fzf can handle inputs with millions of lines interactively. Internal benchmarks show it can filter 1 million lines in under 100ms on modern hardware. It achieves this through concurrent matching across CPU cores, incremental result updates, and a cache that reuses previous results when you type additional characters.
Alt+C for directory jumping was inspired by autojump¶
fzf's Alt+C keybinding (fuzzy cd into a subdirectory) was inspired by tools like autojump and z. But unlike those tools, which require building a frecency database over time, fzf's Alt+C works immediately by scanning the filesystem in real time. No training period needed.
fzf is the most-starred Go project on GitHub that is not infrastructure¶
With over 65,000 GitHub stars, fzf is one of the most popular Go projects ever. Unlike most top-starred Go projects (Kubernetes, Docker, Terraform), fzf is a single-user CLI tool, not infrastructure software. Its star count reflects genuine individual developer adoption rather than enterprise usage.
The --bind flag creates mini-applications¶
fzf's --bind flag can map keys to actions like reload, execute, preview, toggle, and change-prompt. This makes it possible to build complete interactive TUI applications — file managers, git UIs, package browsers — using only fzf and shell commands. Some community scripts exceed 100 lines of pure fzf configuration.
fzf's Vim plugin predates the CLI tool's fame¶
Choi wrote fzf.vim early in fzf's life, providing fuzzy file finding, buffer switching, and grep inside Vim. This Vim integration was a major driver of fzf's early adoption, as Vim users shared it in their dotfile repositories. The plugin remains one of the most popular Vim plugins with its own dedicated user community.
Exact matching is hidden in plain sight¶
Most users do not know that fzf supports exact matching with a ' prefix, suffix anchoring with $, prefix anchoring with ^, and negation with !. The query ^src .go$ !test finds items starting with "src", ending with ".go", excluding "test". This mini query language is documented but rarely taught.