I installed fzf years ago, used it for Ctrl-r history search, and assumed that was the whole point. It is not. fzf is a tiny, single-purpose tool: it reads lines on stdin, lets you fuzzy-filter them interactively, and prints what you picked. Everything interesting comes from what you feed it and what you do with the result. Once that clicks, it rewires how you move around the terminal entirely.
the one that earns its place every day
The history binding is still the gateway drug. Out of the box, fzf overrides Ctrl-r with a full-screen fuzzy search of your shell history. No more cycling through Ctrl-r presses hoping the right command surfaces. You type three letters from somewhere in the middle of a command you ran last Tuesday and it floats to the top.
That alone is worth the install. But the moment I started piping things into it deliberately, the terminal got a lot smaller.
piping anything into a picker
The pattern is always the same: produce a list, pipe it to fzf, act on the selection. Jumping to a file in a big repo, for instance:
vim "$(fzf)"
That walks the tree and opens whatever you choose. Swap the input for git branch and you get an interactive branch switcher:
git checkout "$(git branch --all | fzf | tr -d ' *')"
Or kill a process without hunting for its PID:
kill -9 "$(ps -ef | fzf | awk '{print $2}')"
None of these are clever. They are three-line aliases at most. The shift is mental: instead of remembering the exact name of a thing, you remember roughly what it was and let fzf do the matching.
the preview window is the bit people miss
The feature that took me far too long to adopt is --preview. fzf can run a command for each line as you scroll, showing the output in a side pane. Point it at a file viewer and you get a file browser with live previews:
fzf --preview 'bat --color=always {}'
{} is the currently highlighted line. With bat (or plain cat) you scroll a list of filenames and watch the contents flick past. I use the same trick over git log to preview each commit's diff before I pick one. It turns a flat list into something you can actually explore.
why it stuck
I have tried plenty of shell tooling that demanded I learn a new mental model and then quietly fell out of use. fzf did the opposite. It bolted onto habits I already had, made them faster, and got out of the way. Six months on I genuinely fumble on machines that do not have it, reaching for Ctrl-r and getting the dull old behaviour back.
If you only do one thing: install it, accept the key bindings, and live with the new Ctrl-r for a week. The rest follows on its own.