8000
Skip to content

peikk0/fzf

 
 

Repository files navigation


fzf - a command-line fuzzy finder github-actions

fzf is a general-purpose command-line fuzzy finder.

It's an interactive filter program for any kind of list; files, command history, processes, hostnames, bookmarks, git commits, etc. It implements a "fuzzy" matching algorithm, so you can quickly type in patterns with omitted characters and still get the results you want.

Highlights

  • 📦 Portable — Distributed as a single binary for easy installation
  • Blazingly fast — Highly optimized code instantly processes millions of items
  • 🛠️ Extremely versatile — Fully customizable via an event-action binding mechanism
  • 🔋 Batteries included — Includes integration with bash, zsh, fish, Vim, and Neovim

Table of Contents

Installation

Using Homebrew

You can use Homebrew (on macOS or Linux) to install fzf.

brew install fzf

Important

To set up shell integration (key bindings and fuzzy completion), see the instructions below.

fzf is also available via MacPorts: sudo port install fzf

Linux packages

Package Manager Linux Distribution Command
APK Alpine Linux sudo apk add fzf
APT Debian 9+/Ubuntu 19.10+ sudo apt install fzf
Conda conda install -c conda-forge fzf
DNF Fedora sudo dnf install fzf
Nix NixOS, etc. nix-env -iA nixpkgs.fzf
Pacman Arch Linux sudo pacman -S fzf
pkg FreeBSD pkg install fzf
pkgin NetBSD pkgin install fzf
pkg_add OpenBSD pkg_add fzf
Portage Gentoo emerge --ask app-shells/fzf
Spack spack install fzf
XBPS Void Linux sudo xbps-install -S fzf
Zypper openSUSE sudo zypper install fzf

Important

To set up shell integration (key bindings and fuzzy completion), see the instructions below.

Packaging status

Windows packages

On Windows, fzf is available via Chocolatey, Scoop, Winget, and MSYS2:

Package manager Command
Chocolatey choco install fzf
Scoop scoop install fzf
Winget winget install fzf
MSYS2 (pacman) pacman -S $MINGW_PACKAGE_PREFIX-fzf

Using git

Alternatively, you can "git clone" this repository to any directory and run install script.

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

The install script will add lines to your shell configuration file to modify $PATH and set up shell integration.

Binary releases

You can download the official fzf binaries from the releases page.

Setting up shell integration

Add the following line to your shell configuration file.

  • bash
    # Set up fzf key bindings and fuzzy completion
    eval "$(fzf --bash)"
  • zsh
    # Set up fzf key bindings and fuzzy completion
    source <(fzf --zsh)
  • fish
    # Set up fzf key bindings
    fzf --fish | source

Note

--bash, --zsh, and --fish options are only available in fzf 0.48.0 or later. If you have an older version of fzf, or want finer control, you can source individual script files in the /shell directory. The location of the files may vary depending on the package manager you use. Please refer to the package documentation for more information. (e.g. apt show fzf)

Tip

You can disable CTRL-T or ALT-C binding by setting FZF_CTRL_T_COMMAND or FZF_ALT_C_COMMAND to an empty string when sourcing the script. For example, to disable ALT-C binding:

  • bash: FZF_ALT_C_COMMAND= eval "$(fzf --bash)"
  • zsh: FZF_ALT_C_COMMAND= source <(fzf --zsh)
  • fish: fzf --fish | FZF_ALT_C_COMMAND= source

Setting the variables after sourcing the script will have no effect.

Vim/Neovim plugin

If you use vim-plug, add this to your Vim configuration file:

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
  • junegunn/fzf provides the basic library functions
    • fzf#install() makes sure that you have the latest binary
  • junegunn/fzf.vim is a separate project that provides a variety of useful commands

To learn more about the Vim integration, see README-VIM.md.

Tip

If you use Neovim and prefer Lua-based plugins, check out fzf-lua.

Upgrading fzf

fzf is being actively developed, and you might want to upgrade it once in a while. Please follow the instruction below depending on the installation method used.

  • git: cd ~/.fzf && git pull && ./install
  • brew: brew update; brew upgrade fzf
  • macports: sudo port upgrade fzf
  • chocolatey: choco upgrade fzf
  • vim-plug: :PlugUpdate fzf

Building fzf

See BUILD.md.

Usage

fzf will launch interactive finder, read the list from STDIN, and write the selected item to STDOUT.

find * -type f | fzf > selected

Without STDIN pipe, fzf will traverse the file system under the current directory to get the list of files.

vim $(fzf)

Note

You can override the default behavior

  • Either by setting $FZF_DEFAULT_COMMAND to a command that generates the desired list
  • Or by setting --walker, --walker-root, and --walker-skip options in $FZF_DEFAULT_OPTS

Warning

A more robust solution would be to use xargs but we've presented the above as it's easier to grasp

fzf --print0 | xargs -0 -o vim

Tip

fzf also has the ability to turn itself into a different process.

fzf --bind 'enter:become(vim {})'

See Turning into a different process for more information.

Using the finder

  • CTRL-K / CTRL-J (or CTRL-P / CTRL-N) to move cursor up and down
  • Enter key to select the item, CTRL-C / CTRL-G / ESC to exit
  • On multi-select mode (-m), TAB and Shift-TAB to mark multiple items
  • Emacs style key bindings
  • Mouse: scroll, click, double-click; shift-click and shift-scroll on multi-select mode

Display modes

fzf by default runs in fullscreen mode, but there are other display modes.

--height mode

With --height HEIGHT[%], fzf will start below the cursor with the given height.

fzf --height 40%

reverse layout and --border goes well with this option.

fzf --height 40% --layout reverse --border

By prepending ~ to the height, you're setting the maximum height.

# Will take as few lines as possible to display the list
seq 3 | fzf --height ~100%
seq 3000 | fzf --height ~100%

Height value can be a negative number.

# Screen height - 3
fzf --height -3

--tmux mode

With --tmux option, fzf will start in a tmux popup.

# --tmux [center|top|bottom|left|right][,SIZE[%]][,SIZE[%][,border-native]]

fzf --tmux center         # Center, 50% width and height
fzf --tmux 80%            # Center, 80% width and height
fzf --tmux 100%,50%       # Center, 100% width and 50% height
fzf --tmux left,40%       # Left, 40% width
fzf --tmux left,40%,90%   # Left, 40% width, 90% height
fzf --tmux top,40%        # Top, 40% height
fzf --tmux bottom,80%,40% # Bottom, 80% height, 40% height

--tmux is silently ignored when you're not on tmux.

Note

If you're stuck with an old version of tmux that doesn't support popup, or if you want to open fzf in a regular tmux pane, check out fzf-tmux script.

Tip

You can add these options to $FZF_DEFAULT_OPTS so that they're applied by default. For example,

# Open in tmux popup if on tmux, otherwise use --height mode
export FZF_DEFAULT_OPTS='--height 40% --tmux bottom,40% --layout reverse --border top'

Search syntax