0.74.0 # (Jul 2026) Quick summary # The headline change is --popup on tmux 3.7+, which now opens fzf in a floating pane instead of a modal popup. A new result-final event and a new wait action let bound actions operate on the final result set instead of intermediate snapshots while the input is still loading. Type Class Name Description Change Terminal --popup (tmux 3.7+) Opens in a floating pane…
Reference # This is a Markdown rendition of the fzf man page. For the same content in your terminal, run fzf --man. NAME # fzf - a command-line fuzzy finder SYNOPSIS # fzf [options] DESCRIPTION # fzf is an interactive filter program for any kind of list. It implements a “fuzzy” matching algorithm, so you can quickly type in patterns with omitted characters and still get the results you…
0.66.0 # (Oct 2025) Quick summary # This version introduces many new features centered around the new “raw” mode. Type Class Name Description New Option --raw Enable raw mode by default New Option --gutter CHAR Set the gutter column character New Option --gutter-raw CHAR Set the gutter column character in raw mode Enhancement Option --listen SOCKET Added support for Unix domain sockets…
0.73.0 # (May 2026) Quick summary # This release adds Nushell integration, a new preview window position, and timer-driven bindings backed by an idle-time environment variable. Type Class Name Description New Shell Nushell fzf --nushell and installer support New Option --preview-window=next Preview adjacent to the input section New Event every(N) Timer-driven event for --bind New Env var…
Getting Started # Understanding fzf # Basically, you can think of fzf as an interactive version of “grep” (with bells and whistles, lots of bells and whistles). You feed lines of text to fzf via standard input, fzf starts an interactive terminal interface where you can narrow down the list using fuzzy matching algorithm. And when you finally make a selection, fzf prints it out to…
0.71.0 # (Apr 2026) Quick summary # This release brings performance improvements, Zellij integration, a new --id-nth option for tracking items across reloads, and shell integration enhancements. Type Class Name Description Enhancement Perf Linearly scalable search performance across CPU cores Enhancement Perf 86x reduction in cache memory footprint per entry New Option --popup New name for --tmux…
0.70.0 # (Mar 2026) Quick summary # This release focuses on performance improvements and adds a couple of new actions for dynamically changing display options. Type Class Name Description Enhancement Perf 1.3x to 1.9x faster filtering New Action change-with-nth Dynamically change --with-nth option New Action change-header-lines Dynamically change --header-lines option 1. Performance improvements #…
0.68.0 # (Feb 2026) Quick summary # This release introduces word wrapping for both the list and preview sections, underline style variants, and fish shell improvements. Type Class Name Description New Option --wrap=word Word-level wrapping in the list section New Option --preview-window wrap-word Word-level wrapping in the preview window New Option --preview-wrap-sign Wrap indicator for the…
0.67.0 # (Nov 2025) Quick summary # Type Class Name Description New Option --freeze-left Keep the leftmost N columns always visible New Option --freeze-right Keep the rightmost N columns always visible Enhancement Option --info=inline Now prints the spinner (load indicator) 1. --freeze-left=N # The new --freeze-left=N option keeps the leftmost N columns always visible, even when the content is…
Browsing Chrome history and bookmarks with fzf # Info You might want to check out https://github.com/junegunn/everything.fzf which includes a more complete version of this script, along with many other integrations. In this example, you’ll learn how to browse Chrome history and bookmarks from the command-line using fzf. Getting the input data # Chrome manages the browsing history in an…
Ripgrep integration, a walkthrough # The two pillars of fzf # The interactive terminal interface and the fuzzy matching algorithm are the two pillars of fzf. However, the usefulness of the latter is rather limited in a non-interactive environment. This is because by its very nature, it generates irrelevant matches and user confirmation is almost always necessary. fzf --filter lt <…
Directory navigation with fzf # ALT-C binding allows you to easily move to a subdirectory. But for directories not under the current directory, we need a different approach. Fuzzy completion helps (e.g. cd ../../foo/**<TAB>), but that’s still a lot of typing. You definitely need a program that keeps track of the directories you visit frequently and allows you to jump between them quickly. It…
0.60.0 # (February 2025) Choosing output fields # This release introduces --accept-nth option for choosing fields to print on exit. It can be used to replace cut, sed, or awk in the post-processing step. # Use 'awk' to print the second field ps -ef | fzf --multi --header-lines 1 | awk '{print $2}' # Now you can do this with fzf ps -ef | fzf --multi --header-lines 1 --accept-nth 2 # Use 'cut' to…
0.59.0 # (February 2025) Highlights # Enhanced path scheme to prioritize file name matches click-header event now sets $FZF_CLICK_HEADER_WORD and $FZF_CLICK_HEADER_NTH, allowing you to implement a clickable header for changing the search scope search and transform-search action to extend the search syntax of fzf --header-lines-border to display header from --header-lines with a separate border…
0.58.0 # (January 2025) Happy new year! fzf 0.58.0 is a big release with many new features and improvements. Highlights # Style presets fzf now offers three “style presets” for quick customization. You can activate a preset using the --style=[default|minimal|full[:BORDER_STYLE] option. More borders Three new border types, --list-border, --input-border, and --header-border are added,…
Processing multi-line items # fzf is most commonly used to process single-line items like most other Unix tools. But you can also use it to process multi-line items as well and fzf is capable of properly displaying them in multi-line. To do that, you need to feed NUL-separated list to fzf and use --read0 option because a new line character can no longer be used to separate items. # Many tools…
Frequently Asked Questions # Where should I put plugin configuration? # The most common way to configure a Vim plugin is to define global variables and/or mappings. Since you can define variables and mappings even when the plugin is not available, it’s safe to put them anywhere you prefer. I put a plugin’s configuration right after its Plug command so that it’s easier to manage.…
0.55.0 # (August 2024) Exact-boundary-match type # fzf 0.55.0 added exact-boundary-match type to its search syntax. When a search term is single-quoted, fzf will search for the exact occurrences of the string with both ends at word boundaries. fzf --query ''here'' << EOF come here not there EOF Unlike in regular expressions, this also sees an underscore as a word boundary. But the words around…
Tmux integration # Tmux plugins # There are tmux plugins that utilize fzf for better experience. junegunn/tmux-fzf-url # The one I enjoy the most is junegunn/tmux-fzf-url. It allows me to quickly open URLs in the browser with just a few key strokes. Highly recommended. sainnhe/tmux-fzf # sainnhe/tmux-fzf allows you to perform various actions on tmux using fzf. It’s probably the most…
Search syntax # Sometimes fuzzy matching is not enough. fzf implements its own simple search syntax to augment fuzzy matching. Multiple search terms # You can type in multiple search terms delimited by spaces. For example, fzf sees ^music .mp3$ sbtrkt !fire as four separate search terms. Match types # Token Match type Description sbtrkt fuzzy-match Items that include sbtrkt characters in that…
Completing Git objects with fzf # If you’re like me and you prefer to write Git commands by hand, you often need to type in commit hashes, branch names, tags, etc. And fzf can really help you with that. With its numerous subcommands and options, git can be quite daunting even for the experienced. There is sophisticated, context-aware completion support for git command, but I find it lacking…
0.54.0 # (July 2024) Enabling line wrap with --wrap # fzf can now be configured to wrap long lines instead of truncating them. --wrap enables line wrapping --wrap-sign=INDICATOR specifies the indicator for wrapped lines. The default is '↳ '. You can use toogle-wrap action to dynamically toggle wrapping fzf by default binds CTRL-/ and ALT-/ to toggle-wrap declare -f | perl -0777 -pe 's/^}\n/}\0/gm'…
0.53.0 # (June 2024) 0.53.0 is a huge release with major improvements and changes. Bugs are expected, so please report them if you find any. Multi-line display # Finally, fzf can now display multi-line items properly. And CTRL-R bindings (command history) for all three shells have been updated to leverage this and display multi-line commands in their original form. And here are some other…
Shell Integration # To be useful out of the box without any scripting effort, fzf provides shell integration for bash, zsh and fish. CTRL-T, ALT-C, CTRL-R for bash, zsh, and fish Fuzzy completion for bash and zsh Setting up shell integration # To set up shell integration, add the following to your shell configuration file: bash (~/.bashrc) eval '$(fzf --bash)' zsh (~/.zshrc) source <(fzf --zsh)…
Browsing log streams with fzf # In order to allow changing queries and getting the updated results in real-time, fzf keeps the whole input list in memory and scans the list whenever the query changes. So if you attach fzf to an endless input stream, such as server logs, the memory usage will grow indefinitely and fzf will eventually crash. To work around this limitation, fzf provides --tail=NUM…
Using fzf in your program # While fzf is most commonly used in shell scripts, you can also use it in your programs written in different languages. As a Go library # fzf is written in Go, so you can use it as a library in your Go programs. However, the API is experimental and subject to change. I’ll try to keep this gist up-to-date with the latest changes.
Automatic installation # Vim script # Place the following code in your .vimrc before plug#begin() call, and Vim will automatically install vim-plug and the plugins when you open Vim. let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim' if empty(glob(data_dir . '/autoload/plug.vim')) silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs…
Installation # Using Homebrew # Homebrew is the recommended way to install fzf, as it provides the most recent version of fzf. brew install fzf Using other package managers # Linux # Click to expand 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…
Installation # vim-plug is distributed as a single Vim script file, so that it’s super easy to get started. Just download the file and put it in the “autoload” directory. Or you can simply run one of the following commands depending on your environment. Vim # Unix # curl -fLo ~/.vim/autoload/plug.vim --create-dirs \…
Getting Started # Add a vim-plug section to your ~/.vimrc (or init.vim for Neovim) Begin the section with call plug#begin() List the plugins with Plug commands End the section with call plug#end() For example, call plug#begin() ' List your plugins here Plug 'tpope/vim-sensible' call plug#end() Reload the file or restart Vim, then you can, :PlugInstall to install the plugins :PlugUpdate to install…
Example # The following examples demonstrate the features of vim-plug. You probably don’t need to know all of these options, but they are here to give you an idea of what you can do with vim-plug. call plug#begin() ' The default plugin directory will be as follows: ' - Vim (Linux/macOS): '~/.vim/plugged' ' - Vim (Windows): '~/vimfiles/plugged' ' - Neovim (Linux/macOS/Windows):…
Example (Lua) # In Neovim, you can write your configuration in a Lua script file named init.lua. The following code is the Lua script equivalent to the Vim script example. local vim = vim local Plug = vim.fn['plug#'] vim.call('plug#begin') -- Shorthand notation for GitHub; translates to https://github.com/junegunn/seoul256.vim.git Plug('junegunn/seoul256.vim') -- Any valid git URL is allowed…