Because of the Unix-like nature of FZF (list through stdin, selection through stdout), it’s very easy to come up with different uses for it.
One of my personal favorites is to select files to open in my text editor. Most basic would be:
$ vim "$(fzf)"
Since FZF uses find
to list files by default.
What about multiple files, though? FZF has --multi
, so…
$ # Doing it wrongly
$ vim "$(fzf --multi)"
Unfortunately, if you try to select a.txt
and b.txt
with that, you’ll find that vim will open a single file with one long a.txt^@b.txt
as its filename.
You can’t exactly go unquoted either:
$ # Still doing it wrongly
$ vim $(fzf --multi)
Because now if you select My First Text File.txt
, vim will open 4 files, My
, First
, Text
, and File.txt
.
I have a more robust version of the above (slightly more robust than warranted in most cases), stored in a shell function:
# Requires arrays, so bash >= 4, zsh, etc
ez() {
files=()
while IFS= read -r -d '' file; do
files+=("$file")
done < <(fzf --multi --print0)
(( ${#files} )) || return
"${VISUAL:-${EDITOR:-vi}}" "$@" "${files[@]}"
}
Because of the reliance on VISUAL and EDITOR, you can easily use this for any text editor of your choice (vim, emacs, nano, any modern editor, etc).
Once you already have a text editor instance running, it’s pretty easy to make use of a plugin to integrate with FZF.
I personally use Vim, so naturally I have the fzf.vim plugin.