Awesome Open Source
Awesome Open Source

fzf.fish 🔍🐟

latest release badge build status badge awesome badge

Augment your Fish command line with mnemonic key bindings to efficiently find what you need using fzf.

Features

Use fzf.fish to interactively find and insert different shell entities into the command line:

File paths

file search

  • Search input: recursive listing of current directory's non-hidden files
  • Key binding and mnemonic: Ctrl+Alt+F (F for file)
  • Preview window: file with syntax highlighting, directory contents, or file type
  • Remarks
    • appends / if the selection is a directory and the only path selected so you can hit ENTER to immediately cd into it
    • if the current token is a directory with a trailing slash (e.g. .config/<CURSOR>), then that directory is searched instead
    • ignores files that are also ignored by git
    • Tab to multi-select

Modified paths

git status select

  • Search input: the current repository's git status
  • Key binding and mnemonic: Ctrl+Alt+S (S for status)
  • Remarks: Tab to multi-select

A commit hash

git log search

  • Search input: the current repository's formatted git log
  • Key binding and mnemonic: Ctrl+Alt+L (L for log)
  • Preview window: commit message and diff

A previously run command

command history search

  • Search input: the command history from all interactive sessions of Fish
  • Key binding and mnemonic: Ctrl+R (R for reverse-i-search)
  • Preview window: the entire command, wrapped

A shell variable

shell variables search

  • Search input: all the variable names of the environment currently in scope
  • Key binding and mnemonic: Ctrl+V (V for variable)
  • Preview window: the scope info and values of the variable
  • Remarks
    • $history is excluded for technical reasons so use the search command history feature instead to inspect it

The prompt used in the screencasts was created using IlanCosman/tide.

Installation

First, install a proper version of these CLIs:

CLI Minimum version required Description
fish 3.2.0 a modern shell
fzf 0.27.2 command-line fuzzy finder that powers this plugin
fd 7.5.0 much faster and friendlier alternative to find
bat 0.16.0 smarter cat with syntax highlighting

On certain distribution of Linux, you need to alias fdfind to fd (see #93).

Next, install this plugin with Fisher.

fzf.fish can be installed manually or with other plugin managers but only Fisher is officially supported.

fisher install PatrickF1/fzf.fish

Configuration

Customize key bindings

fzf.fish includes a convenient wrapper for configuring its key bindings. It comes with command completions and is thoroughly documented. See

fzf_configure_bindings --help

Once you've found the fzf_configure_bindings command that produces the desired bindings, add it to your config.fish in order to persist the bindings.

Pass fzf options to all commands

fzf supports setting default options via the FZF_DEFAULT_OPTS environment variable. If it is set, fzf implicitly prepends it to the options passed to it on every execution, scripted and interactive.

To make fzf's interface friendlier, fzf.fish takes the liberty of setting a sane FZF_DEFAULT_OPTS if it is not already set. See conf.d/fzf.fish for more details. This affects fzf even outside of this plugin. If you would like to remove this side effect or just want to customize fzf's default options, then set export your own FZF_DEFAULT_OPTS variable. For example:

set --export FZF_DEFAULT_OPTS --height 50% --no-extended +i

Pass fzf options to a specific command

The following variables can store custom options that will be passed to fzf by their respective feature:

Feature Variable
Search directory fzf_dir_opts
Search git status fzf_git_status_opts
Search git log fzf_git_log_opts
Search command history fzf_history_opts
Search shell variables fzf_shell_vars_opts

They are always appended last to fzf's argument list. Because fzf uses the option appearing last when options conflict, your custom options can override hardcoded options. Custom fzf options unlocks a variety of possibilities in customizing and augmenting each feature such as:

Change the command used to preview files

The search directory feature, by default, uses bat to preview the contents of files. bat is a well-adopted cat replacement with syntax highlighting, line numbers, and more. If you would like to change the preview tool (to cat to avoid installing a new dependency, or to add custom logic such as binary or image preview), you may set the fzf_preview_file_cmd variable. For example, in your config.fish, you may put:

set fzf_preview_file_cmd cat

Do not specify a target path in the command, as fzf.fish will prepend the file to preview to the command itself.

Change the command used to preview directories

The search directory feature, by default, uses ls to preview the contents of directories. To integrate with the variety of ls replacements available (e.g. exa, lsd, tree), the command used to preview directories is configurable through the fzf_preview_dir_cmd variable. Set fzf_preview_dir_cmd in your config.fish:

set fzf_preview_dir_cmd exa --all --color=always

As above, do not specify a target path in the command. fzf.fish will prepend the directory to preview to the command itself.

Change the files searched

To pass custom options to fd when it is executed to populate the list of files for the search directory feature, set the fzf_fd_opts variable. For example, to include hidden files but not .git, put this in your config.fish:

set fzf_fd_opts --hidden --exclude=.git

Further reading

Find answers to these questions and more in the project Wiki:


Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
shell (10,521
fish (96
fzf (56
fish-shell (32