:cherry_blossom: A command-line fuzzy finder
fzf is a general-purpose command-line fuzzy finder and an interactive terminal toolkit.
Whether you're selecting files, browsing command history, previewing data, navigating complex datasets with fuzzy matching, or creating custom menus and workflows, fzf provides the building blocks to turn shell scripts into rich terminal applications.
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
You can use mise to install fzf.
mise use -g fzf@latest| 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.
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 |
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/installThe install script will add lines to your shell configuration file to modify
$PATH and set up shell integration.
You can download the official fzf binaries from the releases page.
Add the following line to your shell configuration file.
# Set up fzf key bindings and fuzzy completion
eval "$(fzf --bash)"# Set up fzf key bindings and fuzzy completion
source <(fzf --zsh)# Set up fzf key bindings
fzf --fish | sourcesource, so the install
script generates a file in the autoload directory. If you didn't use the
install script, you can manually set it up:# Generate the integration script
mkdir ($nu.default-config-dir | path join "autoload")
fzf --nushell | save -f ($nu.default-config-dir | path join "autoload" "_fzf_integration.nu")[!NOTE]
--bash,--zsh,--fish, and--nushelloptions are only available in recent versions of fzf. 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, CTRL-R, or ALT-C bindings by setting the corresponding
*_COMMANDvariable to an empty string when sourcing the script. For example, to disable CTRL-R and ALT-C:
- bash:
FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --bash)"- zsh:
FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source <(fzf --zsh)- fish:
fzf --fish | FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source- nushell: add to your
env.nu:$env.FZF_CTRL_R_COMMAND = ""; $env.FZF_ALT_C_COMMAND = ""Setting the variables after sourcing the script will have no effect.
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 functionsfzf#install() makes sure that you have the latest binaryjunegunn/fzf.vim is a separate project
that provides a variety of useful commandsTo learn more about the Vim integration, see README-VIM.md.
[!TIP] If you use Neovim and prefer Lua-based plugins, check out fzf-lua.
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.
cd ~/.fzf && git pull && ./installbrew update; brew upgrade fzfsudo port upgrade fzfchoco upgrade fzf:PlugUpdate fzfSee BUILD.md.
fzf will launch interactive finder, read the list from STDIN, and write the selected item to STDOUT.
find * -type f | fzf > selectedWithout 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_COMMANDto a command that generates the desired list- Or by setting
--walker,--walker-root, and--walker-skipoptions in$FZF_DEFAULT_OPTS
[!WARNING] A more robust solution would be to use
xargsbut we've presented the above as it's easier to graspfzf --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.
CTRL-K / CTRL-J (or CTRL-P / CTRL-N) to move cursor up and downEnter key to select the item, CTRL-C / CTRL-G / ESC to exit-m), TAB and Shift-TAB to mark multiple itemsfzf by default runs in fullscreen mode, but there are other display modes.
--height modeWith --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 --borderBy 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--popup modeWith --popup option, fzf will start in a popup window
(requires tmux 3.3+ or Zellij 0.44+).
# --popup [center`:FZF!` no longer follows dynamic `g:terminal_ansi_colors` changes
csi and modifyotherkeys ctrl-backspace input handing
Add `shift-space` key name for Kitty `CSI 32;2u`
[FEATURE] multiple selection types
Feature: Built-in copy action for cross-platform clipboard support
pending STDIN and --height=~80% delay first paint indefinitely
Perf: Collect fish completion results in bulk
Use vim as previewer
[Feature] Ability to change the cursor in the header on WIndows FullScreen
Regression in 0.74.1 (and 0.74.2) where there's an invalid space after the last character typed in Emacs, 0.74.0 works correctly