Skip to content

Instantly share code, notes, and snippets.

@igemnace
Last active September 24, 2024 16:30
Show Gist options
  • Save igemnace/589892435d9410209261363fd0ef20cc to your computer and use it in GitHub Desktop.
Save igemnace/589892435d9410209261363fd0ef20cc to your computer and use it in GitHub Desktop.
FZF and Text Editors

FZF and Text Editors

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.

Multiple files: the problem

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.

Multiple files: the solution

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).

Demo: asciinema

FZF from within the running editor

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment