> [!NOTE] > 本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。 > [English](./README.en.md) · [原始项目](https://github.com/junegunn/fzf) · [上游 README](https://github.com/junegunn/fzf/blob/HEAD/README.md) > 原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
---
无论你是选择文件、浏览命令历史、预览数据、
通过模糊匹配浏览复杂数据集,还是创建自定义菜单和
工作流,fzf 都提供了将 shell 脚本转变为丰富
终端应用所需的构建模块。
亮点
----------
- **便携** // 以单一二进制文件分发,便于安装
- **快速** // 经过优化,可在毫秒内处理数百万条目
- **可编程** // 事件驱动架构,用于构建自定义终端界面和工作流
- **开箱即用** // 内置与 Bash、Zsh、Fish、Nushell、Vim 和 Neovim 的集成
目录
-----------------
* [安装](#installation)
* [使用 Homebrew](#using-homebrew)
* [使用 Mise](#using-mise)
* [Linux 软件包](#linux-packages)
* [Windows 软件包](#windows-packages)
* [使用 git](#using-git)
* [二进制发行版](#binary-releases)
* [配置 shell 集成](#setting-up-shell-integration)
* [Vim/Neovim 插件](#vimneovim-plugin)
* [升级 fzf](#upgrading-fzf)
* [构建 fzf](#building-fzf)
* [用法](#usage)
* [使用查找器](#using-the-finder)
* [显示模式](#display-modes)
* [`--height` 模式](#--height-mode)
* [`--popup` 模式](#--popup-mode)
* [搜索语法](#search-syntax)
* [环境变量](#environment-variables)
* [自定义外观](#customizing-the-look)
* [选项](#options)
* [演示](#demo)
* [示例](#examples)
* [命令行快捷键](#key-bindings-for-command-line)
* [模糊补全](#fuzzy-completion)
* [文件和目录](#files-and-directories)
* [进程 ID](#process-ids)
* [主机名](#host-names)
* [环境变量 / 别名](#environment-variables--aliases)
* [为 bash 和 zsh 自定义模糊补全](#customizing-fuzzy-completion-for-bash-and-zsh)
* [自定义 fzf 补全选项](#customizing-fzf-options-for-completion)
* [自定义路径和目录的补全来源](#customizing-completion-source-for-paths-and-directories)
* [支持的命令(bash)](#supported-commands-bash)
* [自定义模糊补全](#custom-fuzzy-completion)
* [Fish 的模糊补全](#fuzzy-completion-for-fish)
* [Nushell 的模糊补全](#fuzzy-completion-for-nushell)
* [Vim 插件](#vim-plugin)
* [高级主题](#advanced-topics)
* [针对不同输入类型的自定义](#customizing-for-different-types-of-input)
* [性能](#performance)
* [执行外部程序](#executing-external-programs)
* [切换为不同进程](#turning-into-a-different-process)
* [重新加载候选列表](#reloading-the-candidate-list)
* [1. 按 CTRL-R 更新进程列表](#1-update-the-list-of-processes-by-pressing-ctrl-r)
* [2. 按 CTRL-D 或 CTRL-F 在来源之间切换](#2-switch-between-sources-by-pressing-ctrl-d-or-ctrl-f)
* [3. 交互式 ripgrep 集成](#3-interactive-ripgrep-integration)
* [预览窗口](#preview-window)
* [预览图片](#previewing-an-image)
* [技巧](#tips)
* [遵循 `.gitignore`](#respecting-gitignore)
* [Fish shell](#fish-shell)
* [fzf 主题游乐场](#fzf-theme-playground)
* [相关项目](#related-projects)
* [许可证](#license)
* [周边商品](#goods)
* [赞助者 :heart:](#sponsors-heart)
安装
------------
### 使用 Homebrew
你可以使用 [Homebrew](https://brew.sh/)(在 macOS 或 Linux 上)安装 fzf。
```sh
brew install fzf
```
> [!IMPORTANT]
> 要配置 shell 集成(快捷键和模糊补全),
> 请参阅[下方说明](#setting-up-shell-integration)。
fzf 也可通过 [MacPorts][portfile] 获取:`sudo port install fzf`
[portfile]: https://github.com/macports/macports-ports/blob/master/sysutils/fzf/Portfile
### 使用 Mise
你可以使用 [mise](https://github.com/jdx/mise) 安装 fzf。
```sh
mise use -g fzf@latest
```
### Linux 软件包
| 软件包管理器 | Linux 发行版 | 命令 |
| --------------- | ----------------------- | ---------------------------------- |
| 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]
> 要配置 shell 集成(快捷键和模糊补全),
> 请参阅[下方说明](#setting-up-shell-integration)。
[](https://repology.org/project/fzf/versions)
### Windows 软件包
在 Windows 上,可通过 [Chocolatey][choco]、[Scoop][scoop]、
[Winget][winget] 和 [MSYS2][msys2] 安装 fzf:
| 软件包管理器 | 命令 |
| --------------- | ------------------------------------- |
| Chocolatey | `choco install fzf` |
| Scoop | `scoop install fzf` |
| Winget | `winget install fzf` |
| MSYS2 (pacman) | `pacman -S $MINGW_PACKAGE_PREFIX-fzf` |
[choco]: https://chocolatey.org/packages/fzf
[scoop]: https://github.com/ScoopInstaller/Main/blob/master/bucket/fzf.json
[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/j/junegunn/fzf
[msys2]: https://packages.msys2.org/base/mingw-w64-fzf
### 使用 git
或者,你可以将此仓库 "git clone" 到任意目录,然后运行
[安装](https://github.com/junegunn/fzf/blob/master/install) 脚本。
```sh
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
```
安装脚本会向你的 shell 配置文件中添加行,以修改
`$PATH` 并设置 shell 集成。
### 二进制发布版
你可以从发布页面下载官方的 fzf 二进制文件。
* https://github.com/junegunn/fzf/releases
### 设置 shell 集成
将以下行添加到你的 shell 配置文件中。
* bash
```sh
# 设置 fzf 快捷键和模糊补全
eval "$(fzf --bash)"
```
* zsh
```sh
# 设置 fzf 快捷键和模糊补全
source <(fzf --zsh)
```
* fish
```fish
# 设置 fzf 快捷键
fzf --fish | source
```
* Nushell——Nushell 不支持将内容管道到 `source`,因此安装
脚本会在自动加载目录中生成一个文件。如果你没有使用安装脚本,可以手动设置:
```nu
# 生成集成脚本
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` 和 `--nushell` 选项仅适用于
> 较新版本的 fzf。如果你使用较旧版本的 fzf,或希望进行更精细的控制,可以
> 引用 [/shell](/shell) 目录中的各个脚本文件。这些
> 文件的位置可能因你所用的包管理器而异。
> 请参阅包文档以获取更多信息。
> (例如 `apt show fzf`)
> [!TIP]
> 你可以通过在引用脚本时,将对应的 `*_COMMAND` 变量设为空字符串来禁用
> CTRL-T、CTRL-R 或 ALT-C 快捷键。例如,禁用 CTRL-R 和 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:在你的 `env.nu` 中添加:
> `$env.FZF_CTRL_R_COMMAND = ""; $env.FZF_ALT_C_COMMAND = ""`
>
> 在引用脚本之后设置变量将不会生效。
### Vim/Neovim 插件
如果你使用 [vim-plug](https://github.com/junegunn/vim-plug),),请将以下内容添加到
你的 Vim 配置文件中:
```vim
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
```
* `junegunn/fzf` 提供基础库函数
* `fzf#install()` 确保你拥有最新二进制文件
* `junegunn/fzf.vim` 是[一个独立项目](https://github.com/junegunn/fzf.vim)),
提供各种有用的命令
要了解更多关于 Vim 集成的信息,请参阅 [README-VIM.md](README-VIM.md)。
> [!TIP]
> 如果你使用 Neovim 并偏好基于 Lua 的插件,请查看
> [fzf-lua](https://github.com/ibhagwan/fzf-lua).)
升级 fzf
-------------
fzf 正在积极开发中,你可能需要时不时地升级它。请根据你使用的安装方式
按照以下说明操作。
- 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`
构建 fzf
------------
请参阅 [BUILD.md](BUILD.md)。
用法
-----
fzf 会启动交互式查找器,从 STDIN 读取列表,并将选中的项目写入 STDOUT。
```sh
find * -type f | fzf > selected
```
没有 STDIN 管道时,fzf 会遍历当前目录下的文件系统来获取文件列表。
```sh
vim $(fzf)
```
> [!NOTE]
> 你可以覆盖默认行为
> * 要么将 `$FZF_DEFAULT_COMMAND` 设置为一个生成所需列表的命令
> * 要么在 `$FZF_DEFAULT_OPTS` 中设置 `--walker`、`--walker-root` 和 `--walker-skip` 选项
> [!WARNING]
> 更稳健的解决方案是使用 `xargs`,但我们展示
> 了上述方案,因为它更容易理解
> ```sh
> fzf --print0 | xargs -0 -o vim
> ```
> [!TIP]
> fzf 还能够将自身转换为另一个进程。
>
> ```sh
> fzf --bind 'enter:become(vim {})'
> ```
>
> *有关更多信息,请参阅[转换为另一个进程](#turning-into-a-different-process)。*
### 使用查找器
- `CTRL-K` / `CTRL-J`(或 `CTRL-P` / `CTRL-N`)上下移动光标
- `Enter` 键选择项目,`CTRL-C` / `CTRL-G` / `ESC` 退出
- 多选模式(`-m`)下,使用 `TAB` 和 `Shift-TAB` 标记多个项目
- Emacs 风格快捷键
- 鼠标:滚动、单击、双击;多选模式下 shift+单击 和 shift+滚动
### 显示模式
fzf 默认以全屏模式运行,但也有其他显示模式。
#### `--height` 模式
使用 `--height HEIGHT[%]`,fzf 将在光标下方以指定高度启动。
```sh
fzf --height 40%
```
`reverse` 布局和 `--border` 与此选项搭配效果良好。
```sh
fzf --height 40% --layout reverse --border
```
在高度前加上 `~`,可以设置最大高度。
```sh
# Will take as few lines as possible to display the list
seq 3 | fzf --height ~100%
seq 3000 | fzf --height ~100%
```
高度值可以是负数。
```sh
# Screen height - 3
fzf --height -3
```
#### `--popup` 模式
使用 `--popup` 选项,fzf 将在弹出窗口中启动
(需要 tmux 3.3+ 或 Zellij 0.44+)。
```sh
# --popup [center|top|bottom|left|right][,SIZE[%]][,SIZE[%][,border-native]]
fzf --popup center # Center, 50% width and height
fzf --popup 80% # Center, 80% width and height
fzf --popup 100%,50% # Center, 100% width and 50% height
fzf --popup left,40% # Left, 40% width
fzf --popup left,40%,90% # Left, 40% width, 90% height
fzf --popup top,40% # Top, 40% height
fzf --popup bottom,80%,40% # Bottom, 80% width, 40% height
```
当你不处于 tmux 或 Zellij 环境中时,`--popup` 会被静默忽略。
> [!NOTE]
> 如果你使用的是不支持弹出窗口的旧版 tmux,
> 或者你想在常规 tmux 窗格中打开 fzf,请查看
> [fzf-tmux](bin/fzf-tmux) 脚本。
> [!TIP]
> 你可以将这些选项添加到 `$FZF_DEFAULT_OPTS` 中,以便默认应用它们。
> 例如,
>
> ```sh
> # 如果在 tmux 或 Zellij 中则在弹出窗口中打开,否则使用 --height 模式
> export FZF_DEFAULT_OPTS='--height 40% --popup bottom,40% --layout reverse --border top'
> ```
### 搜索语法
除非另有指定,fzf 以"扩展搜索模式"启动,你可以输入多个以空格分隔的搜索词。例如 `^music .mp3$ sbtrkt
!fire`
| 标记 | 匹配类型 | 描述 |
| --------- | -------------------------------------- | ------------------------------------------ |
| `sbtrkt` | 模糊匹配 | 匹配 `sbtrkt` 的项目 |
| `'wild` | 精确匹配(带引号) | 包含 `wild` 的项目 |
| `'wild'` | 精确边界匹配(两端均带引号) | 在单词边界处包含 `wild` 的项目 |
| `^music` | 前缀精确匹配 | 以 `music` 开头的项目 |
| `.mp3$` | 后缀精确匹配 | 以 `.mp3` 结尾的项目 |
| `!fire` | 反向精确匹配 | 不包含 `fire` 的项目 |
| `!^music` | 反向前缀精确匹配 | 不以 `music` 开头的项目 |
| `!.mp3$` | 反向后缀精确匹配 | 不以 `.mp3` 结尾的项目 |
如果你不喜欢模糊匹配且不希望给每个词加引号,
请使用 `-e` 或 `--exact` 选项启动 fzf。注意,当设置了
`--exact` 时,`'` 前缀会"取消引号"该词条。
单个竖线字符词条充当 OR 运算符。例如,以下查询匹配以 `core` 开头
且以 `go`、`rb` 或 `py` 结尾的条目。
```
^core go$ | rb$ | py$
```
### 环境变量
- `FZF_DEFAULT_COMMAND`
- 当输入为 tty 时使用的默认命令
- 例如 `export FZF_DEFAULT_COMMAND='fd --type f'`
- `FZF_DEFAULT_OPTS`
- 默认选项
- 例如 `export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"`
- `FZF_DEFAULT_OPTS_FILE`
- 如果你更倾向于在文件中管理默认选项,请将此变量设置为
指向该文件的位置
- 例如 `export FZF_DEFAULT_OPTS_FILE=~/.fzfrc`
> [!WARNING]
> `FZF_DEFAULT_COMMAND` 未被 shell 集成使用,因为需求略有差异。
>
> * `CTRL-T` 运行 `$FZF_CTRL_T_COMMAND` 以获取文件和目录列表
> * `ALT-C` 运行 `$FZF_ALT_C_COMMAND` 以获取目录列表
> * `vim ~/**
|
| `full` |
|
| `minimal` |
|
以下是一个基于 `full` 预设的示例:
示例
--------
* [示例 Wiki 页面](https://github.com/junegunn/fzf/wiki/examples))
* *免责声明:该页面上的示例由社区维护,未经全面测试*
* [高级 fzf 示例](https://github.com/junegunn/fzf/blob/master/ADVANCED.md))
命令行按键绑定
-----------------------------
通过[设置 shell 集成](#setting-up-shell-integration),你可以在 bash、zsh、fish 和 Nushell 中使用以下按键绑定。
- `CTRL-T` - 将选中的文件和目录粘贴到命令行中
- 列表通过 `--walker file,dir,follow,hidden` 选项生成
- 你可以通过设置 `FZF_CTRL_T_COMMAND` 为自定义命令来覆盖默认行为
- 或者你可以在 `FZF_CTRL_T_OPTS` 中设置 `--walker*` 选项
- 设置 `FZF_CTRL_T_OPTS` 以向 fzf 传递额外选项
```sh
# 使用 bat 预览文件内容(https://github.com/sharkdp/bat))
export FZF_CTRL_T_OPTS="
--walker-skip .git,node_modules,target
--preview 'bat -n --color=always {}'
--bind 'ctrl-/:change-preview-window(down|hidden|)'"
```
- 可以通过在加载脚本时将 `FZF_CTRL_T_COMMAND` 设为空字符串来禁用
- `CTRL-R` - 将选中的历史命令粘贴到命令行中。
- 使用 `TAB` 选择多条命令。
- 如果想按时间顺序查看命令,再次按下 `CTRL-R` 可切换为按相关性排序
- 按下 `ALT-R` 切换"原始"模式,可查看匹配项周围的上下文。在该模式下,按下 `CTRL-N` 和 `CTRL-P` 仅在匹配项之间移动。
- 按下 `CTRL-/` 或 `ALT-/` 切换自动换行
- 按下 `SHIFT-DELETE` 删除选中的命令(bash 和 fish)
- 仅限 Fish shell:
- 按下 `ALT-ENTER` 重新格式化并插入选中的命令
- 按下 `ALT-T` 循环切换命令前缀(时间戳、日期/时间、无)
- 设置 `FZF_CTRL_R_OPTS` 以向 fzf 传递额外选项
```sh
# CTRL-Y 使用 pbcopy 将命令复制到剪贴板
export FZF_CTRL_R_OPTS="
--bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort'
--color header:italic
--header 'Press CTRL-Y to copy command into clipboard'"
```
```fish
# Fish shell:设置日期/时间为默认前缀
set -gx FZF_CTRL_R_OPTS "--with-nth 1,3.. --bind 'alt-t:change-with-nth(2..|3..|1,3..)'"
# 或默认不显示前缀
set -gx FZF_CTRL_R_OPTS "--with-nth 3.. --bind 'alt-t:change-with-nth(2..|1,3..|3..)'"
```
- 可以通过在加载脚本时将 `FZF_CTRL_R_COMMAND` 设为空字符串来禁用
- 通过非空的 `FZF_CTRL_R_COMMAND` 进行自定义覆盖暂不支持,会发出警告
- `ALT-C` - 进入选中的目录
- 列表通过 `--walker dir,follow,hidden` 选项生成
- 设置 `FZF_ALT_C_COMMAND` 以覆盖默认命令
- 或者你可以在 `FZF_ALT_C_OPTS` 中设置 `--walker-*` 选项
- 设置 `FZF_ALT_C_OPTS` 以向 fzf 传递额外选项
```sh
# 在预览窗口中打印树形结构
export FZF_ALT_C_OPTS="
--walker-skip .git,node_modules,target
--preview 'tree -C {}'"
```
- 可以通过在加载脚本时将 `FZF_ALT_C_COMMAND` 设为空字符串来禁用
这些绑定的显示模式可通过 `FZF_{CTRL_T,CTRL_R,ALT_C}_OPTS` 单独配置,或通过 `FZF_DEFAULT_OPTS` 全局配置。
(例如:`FZF_CTRL_R_OPTS='--popup bottom,60% --height 60% --border top'`)
更多技巧请参见 [Wiki 页面](https://github.com/junegunn/fzf/wiki/Configuring-shell-key-bindings).)
模糊补全
----------------
Shell 集成还为 bash、zsh、fish 和 Nushell 提供了模糊补全功能。
### 文件和目录
如果光标前的单词以触发序列结尾(默认为 `**`),则可触发文件和目录的模糊补全。
- `COMMAND [DIRECTORY/][FUZZY_PATTERN]**