特别感谢:
Warp 是一个基于 Rust 的现代化终端,内置 AI,因此您和您的团队可以更快地构建出色的软件。
访问 warp.dev 了解更多信息。
fzf 是一个通用的命令行模糊查找器。
它是一个交互式过滤程序,适用于任何类型的列表;文件、命令历史记录、进程、主机名、书签、git 提交等。它实现了“模糊”匹配算法,因此您可以快速输入省略字符的模式,但仍然可以获得您想要的结果。
便携式- 作为单个二进制文件分发,以便于安装
速度极快——高度优化的代码可立即处理数百万个项目
极其通用——通过事件-动作绑定机制完全可定制
包含电池— 包括与 bash、zsh、fish、Vim 和 Neovim 的集成
我要感谢这个项目的所有赞助商,他们使我能够继续改进 fzf。
如果您想赞助该项目,请访问 https://github.com/sponsors/junegunn。
安装
使用自制软件
Linux 软件包
Windows 软件包
使用git
二进制版本
设置 shell 集成
Vim/Neovim 插件
升级fzf
建设fzf
用法
--height
模式
--tmux
模式
使用取景器
显示模式
搜索语法
环境变量
选项
演示
示例
命令行的键绑定
bash 和 zsh 的模糊补全
文件和目录
进程 ID
主机名
环境变量/别名
设置
支持的命令
自定义模糊补全
Vim 插件
高级主题
1. 按 CTRL-R 更新进程列表
2. 按 CTRL-D 或 CTRL-F 在源之间切换
3. 交互式 ripgrep 集成
表现
执行外部程序
转变为不同的过程
重新加载候选列表
预览窗口
预览图像
尖端
尊重.gitignore
鱼壳
fzf主题游乐场
相关项目
执照
您可以使用 Homebrew(在 macOS 或 Linux 上)安装 fzf。
酿造安装fzf
重要的
要设置 shell 集成(按键绑定和模糊完成),请参阅下面的说明。
fzf 也可以通过 MacPorts 获得: sudo port install fzf
包管理器 | Linux发行版 | 命令 |
---|---|---|
应用程序 | 阿尔卑斯Linux | sudo apk add fzf |
易于 | Debian 9+/Ubuntu 19.10+ | sudo apt install fzf |
康达 | conda install -c conda-forge fzf | |
地下城与勇士 | 软呢帽 | sudo dnf install fzf |
尼克斯 | 尼克斯操作系统等 | nix-env -iA nixpkgs.fzf |
吃豆人 | 架构Linux | sudo pacman -S fzf |
包装 | 自由BSD | pkg install fzf |
包金 | 网络BSD | pkgin install fzf |
包添加 | 开放BSD | pkg_add fzf |
波蒂奇 | 根图 | emerge --ask app-shells/fzf |
斯派克 | spack install fzf | |
XBPS | 虚空Linux | sudo xbps-install -S fzf |
扎普 | 开放SUSE | sudo zypper install fzf |
重要的
要设置 shell 集成(按键绑定和模糊完成),请参阅下面的说明。
在 Windows 上,fzf 可通过 Chocolatey、Scoop、Winget 和 MSYS2 获得:
包管理器 | 命令 |
---|---|
巧克力味 | choco install fzf |
舀 | scoop install fzf |
温盖特 | winget install fzf |
MSYS2(吃豆人) | pacman -S $MINGW_PACKAGE_PREFIX-fzf |
或者,您可以“git clone”此存储库到任何目录并运行安装脚本。
git clone --深度 1 https://github.com/junegunn/fzf.git ~/.fzf~/.fzf/install
安装脚本将向您的 shell 配置文件添加行以修改$PATH
并设置 shell 集成。
您可以从发布页面下载官方 fzf 二进制文件。
https://github.com/junegunn/fzf/releases
将以下行添加到您的 shell 配置文件中。
巴什
# 设置 fzf 键绑定和模糊完成eval "$(fzf --bash)"
桀骜
# 设置 fzf 键绑定和模糊补全source <(fzf --zsh)
鱼
# 设置 fzf 键绑定fzf --fish |来源
笔记
--bash
、 --zsh
和--fish
选项仅在 fzf 0.48.0 或更高版本中可用。如果您有旧版本的 fzf,或者想要更好的控制,您可以在 /shell 目录中获取单独的脚本文件。文件的位置可能会有所不同,具体取决于您使用的包管理器。请参阅包文档以获取更多信息。 (例如apt show fzf
)
提示
您可以在获取脚本时通过将FZF_CTRL_T_COMMAND
或FZF_ALT_C_COMMAND
设置为空字符串来禁用 CTRL-T 或 ALT-C 绑定。例如,要禁用 ALT-C 绑定:
bash: FZF_ALT_C_COMMAND= eval "$(fzf --bash)"
zsh: FZF_ALT_C_COMMAND= source <(fzf --zsh)
鱼: fzf --fish | FZF_ALT_C_COMMAND= source
获取脚本后设置变量将不会产生任何效果。
如果您使用 vim-plug,请将其添加到您的 Vim 配置文件中:
插件 'junegunn/fzf', { 'do': { -> fzf#install() } } 插件 'junegunn/fzf.vim'
junegunn/fzf
提供基本的库函数
fzf#install()
确保您拥有最新的二进制文件
junegunn/fzf.vim
是一个单独的项目,提供各种有用的命令
要了解有关 Vim 集成的更多信息,请参阅 README-VIM.md。
提示
如果您使用 Neovim 并且更喜欢基于 Lua 的插件,请查看 fzf-lua。
fzf 正在积极开发中,您可能希望偶尔升级它。请根据所使用的安装方法按照以下说明进行操作。
git: cd ~/.fzf && git pull && ./install
酿造: brew update; brew upgrade fzf
macports: sudo port upgrade fzf
巧克力味: choco upgrade fzf
vim-plug: :PlugUpdate fzf
请参阅 BUILD.md。
fzf 将启动交互式查找器,从 STDIN 读取列表,并将所选项目写入 STDOUT。
查找 * -输入 f | fzf > 已选择
如果没有STDIN管道,fzf将遍历当前目录下的文件系统以获取文件列表。
vim $(fzf)
笔记
您可以覆盖默认行为
通过将$FZF_DEFAULT_COMMAND
设置为生成所需列表的命令
或者通过在$FZF_DEFAULT_OPTS
中设置--walker
、 --walker-root
和--walker-skip
选项
警告
更强大的解决方案是使用xargs
,但我们已经介绍了上面的内容,因为它更容易掌握
fzf--打印0 | xargs -0 -o vim
提示
fzf 还具有将自身变成不同进程的能力。
fzf --bind '输入:成为(vim {})'
有关更多信息,请参阅转变为不同的流程。
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 将以给定高度从光标下方开始。
fzf --高度 40%
reverse
布局和--border
与此选项配合良好。
fzf --高度 40% --布局反转 --边框
通过在高度前添加~
,您可以设置最大高度。
# 将用尽可能少的行来显示列表 3 | fzf --高度 ~100% 序列 3000 | fzf --高度 ~100%
高度值可以是负数。
# 屏幕高度 - 3fzf --height -3
--tmux
模式使用--tmux
选项,fzf 将在 tmux 弹出窗口中启动。
# --tmux [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]fzf --tmux center # 中心,宽度和高度 50%fzf --tmux 80% # 中心, 80% 宽度和高度fzf --tmux 100%,50% # 居中,100% 宽度和 50% 高度fzf --tmux left,40% #左,40% 宽度fzf --tmux left,40%,90% # 左,40% 宽度,90% 高度fzf --tmux top,40% # 顶部,40% 高度fzf --tmux Bottom,80%,40% # 底部, 80% 高度, 40% 高度
--当你不在 tmux 上时, --tmux
会被默默地忽略。
笔记
如果您坚持使用不支持弹出窗口的旧版本 tmux,或者您想在常规 tmux 窗格中打开 fzf,请查看 fzf-tmux 脚本。
提示
您可以将这些选项添加到$FZF_DEFAULT_OPTS
中,以便默认应用它们。例如,
# 如果在 tmux 上,则在 tmux 弹出窗口中打开,否则使用 --height modeexport FZF_DEFAULT_OPTS='--height 40% --tmux 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
时, '
-prefix 会“取消引用”该术语。
单个条形字符项充当 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
警告
由于需求略有不同, FZF_DEFAULT_COMMAND
不被 shell 集成使用。
CTRL-T
运行$FZF_CTRL_T_COMMAND
来获取文件和目录的列表
ALT-C
运行$FZF_ALT_C_COMMAND
来获取目录列表
vim ~/**
以前缀 ( ~/
) 作为第一个参数运行fzf_compgen_path()
cd foo**
以前缀 ( foo
) 作为第一个参数运行fzf_compgen_dir()
本文档稍后将介绍可用选项。
有关选项的完整列表,请参阅手册页 ( man fzf
)。
如果您通过观看视频来学习,请观看 @samoshkin 的截屏视频来探索fzf
功能。
示例 Wiki 页面
免责声明:本页面上的示例由社区维护,未经彻底测试
高级 fzf 示例
通过设置 shell 集成,您可以在 bash、zsh 和 Fish 中使用以下键绑定。
CTRL-T
- 将选定的文件和目录粘贴到命令行上
您可以通过将FZF_CTRL_T_COMMAND
设置为生成所需列表的自定义命令来覆盖该行为
或者您可以在FZF_CTRL_T_OPTS
中设置--walker*
选项
该列表是使用--walker file,dir,follow,hidden
选项生成的
设置FZF_CTRL_T_OPTS
将附加选项传递给 fzf
# 使用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
- 将所选命令从历史记录粘贴到命令行上
如果您想按时间顺序查看命令,请再次按CTRL-R
以切换按相关性排序
按CTRL-/
或ALT-/
切换换行
设置FZF_CTRL_R_OPTS
将附加选项传递给 fzf
# CTRL-Y 使用 pbcopyexport 将命令复制到剪贴板 FZF_CTRL_R_OPTS=" --bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort' --color header:italic --header '按 CTRL-Y 将命令复制到剪贴板'"
ALT-C
- cd 进入所选目录
或者您可以在FZF_ALT_C_OPTS
中设置--walker-*
选项
该列表是使用--walker dir,follow,hidden
选项生成的
设置FZF_ALT_C_COMMAND
以覆盖默认命令
设置FZF_ALT_C_OPTS
以将附加选项传递给 fzf
# 在预览窗口中打印树结构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='--tmux bottom,60% --height 60% --border top'
)
更多提示可以在 wiki 页面上找到。
如果光标前面的单词以触发序列结尾,则可以触发文件和目录的模糊补全,默认为**
。
COMMAND [DIRECTORY/][FUZZY_PATTERN]**
# 当前目录下的文件# - 可以用TAB键选择多项vim **# 父目录下的文件 vim ../** # 父目录下匹配 `fzf` 的文件 vim ../fzf* * # 主目录下的文件 vim ~/** # 当前目录下的目录(单选)cd ** # ~/github 下与 `fzf` 匹配的目录 cd 〜/ github / fzf **
Kill 命令提供了 PID 的模糊补全。
# 可以使用或 键选择多个进程kill -9 **
对于 ssh 和 telnet 命令,提供了主机名的模糊补全。这些名称是从 /etc/hosts 和 ~/.ssh/config 中提取的。
ssh **telnet **
取消设置 **导出 ** unalias **
# 使用 ~~ 作为触发序列而不是默认 **export FZF_COMPLETION_TRIGGER='~~'# fzf 命令的选项export FZF_COMPLETION_OPTS='--border --info=inline'# 使用 fd (https://github.com/ sharkdp/fd) 用于列出候选路径。# - 函数的第一个参数 ($1) 是开始遍历的基本路径# - 查看源代码(补全。{bash,zsh})了解详细信息。_fzf_compgen_path() { fd --hidden --follow --exclude ".git" 。 "$1"}# 使用fd生成目录列表completion_fzf_compgen_dir() { fd --type d --hidden --follow --exclude ".git" 。 "$1"}# 通过 _fzf_comprun 函数高级自定义 fzf 选项# - 函数的第一个参数是命令的名称。# - 您应该确保将其余参数传递给 fzf._fzf_comprun() { local command =1美元 转移 case "$command" incd) fzf --preview 'tree -C {} |头-200'“$@”;; 导出|取消设置) fzf --preview "eval 'echo $'{}" "$@" ;; ssh) fzf --preview 'dig {}' "$@" ;;*) fzf --preview 'bat -n --color=always {}' "$@" ;; 埃萨克}
在 bash 上,仅对一组预定义的命令启用模糊补全( complete | grep _fzf
查看列表)。但是您也可以使用_fzf_setup_completion
辅助函数为其他命令启用它。
# 用法: _fzf_setup_completion 路径|dir|var|alias|主机命令..._fzf_setup_completion 路径 ag git kubectl _fzf_setup_completion 目录树
(自定义完成 API 处于实验阶段,可能会发生变化)
对于名为"COMMAND"的命令,使用_fzf_complete
帮助器定义_fzf_complete_COMMAND
函数。
# “doge”命令的自定义模糊补全# 例如 doge **_fzf_complete_doge() { _fzf_complete --multi --reverse --prompt="doge> " -- "$@" <<( echo very echo wow echo such echo doge )}
--
之前的参数是 fzf 的选项。
在--
之后,只需传递原始完成参数不变( "$@"
)。
然后,编写一组生成补全候选的命令,并使用进程替换 ( < <(...)
) 将其输出提供给函数。
zsh 将使用命名约定自动获取函数,但在 bash 中,您必须使用complete
命令手动将函数与命令关联起来。
[ -n "$BASH" ] && 完整 -F _fzf_complete_doge -o 默认 -o bashdefault doge
如果需要对 fzf 的输出进行后处理,请按如下方式定义_fzf_complete_COMMAND_post
。
_fzf_complete_foo() { _fzf_complete --multi --reverse --header-lines=3 -- "$@" < <( ls -al )}_fzf_complete_foo_post() { awk '{print $NF}'} [ -n "$BASH" ] && 完成 -F _fzf_complete_foo -o 默认 -o bashdefault foo
请参阅 README-VIM.md。
fzf很快。在大多数用例中,性能不应该成为问题。但是,您可能想了解可能影响性能的选项。
--ansi
告诉 fzf 提取并解析输入中的 ANSI 颜色代码,这会使初始扫描速度变慢。因此不建议您将其添加到$FZF_DEFAULT_OPTS
中。
--nth
使 fzf 变慢,因为它必须标记每一行。
--with-nth
使 fzf 变慢,因为 fzf 必须标记并重新组装每一行。
您可以设置用于启动外部进程的键绑定,而无需离开 fzf( execute
、 execute-silent
)。
# 按 F1 以 less 打开文件而不离开 fzf # 按 CTRL-Y 将行复制到剪贴板并中止 fzf (需要 pbcopy)fzf --bind 'f1:execute(less -f {}),ctrl-y:执行静默(echo {} | pbcopy)+中止'
有关详细信息,请参阅手册页的KEY BINDINGS部分。
become(...)
类似于上面描述的execute(...)
/ execute-silent(...)
,但是它不是执行命令并在完成后返回到fzf,而是将fzf变成一个新的进程命令。
fzf --bind '输入:成为(vim {})'
与看似等效的命令替换vim "$(fzf)"
相比,这种方法有几个优点:
当您使用CTRL-C终止 fzf 时,Vim 不会打开空文件
当您在空结果上按ENTER时,Vim 不会打开空文件
即使有空格也可以处理多个选择
fzf --multi --bind '输入:成为(vim {+})'
公平地说,运行fzf --print0 | xargs -0 -o vim
而不是vim "$(fzf)"
解决了提到的所有问题。尽管如此, become(...)
在不同的场景中仍然提供额外的好处。
您可以设置多个绑定以不同的方式处理结果,而无需任何包装脚本
fzf --bind '输入:成为(vim {}),ctrl-e:成为(emacs {})'
以前,您必须使用--expect=ctrl-e
并检查 fzf 输出的第一行
您可以使用 fzf 的字段索引表达式轻松构建后续命令
# 在 Vim 中打开文件并转到行 git grep --line-number 。 |fzf --分隔符 : --nth 3.. --bind 'enter:become(vim {1} +{2})'
通过将reload
操作绑定到按键或事件,您可以使 fzf 动态地重新加载候选列表。有关更多详细信息,请参阅#1750。
ps-ef | fzf --bind 'ctrl-r:reload(ps -ef)' --header '按 CTRL-R 重新加载' --header-lines=1 --高度=50% --布局=反向
FZF_DEFAULT_COMMAND='查找。 -类型f' fzf --bind 'ctrl-d:reload(find . -type d),ctrl-f:reload(eval "$FZF_DEFAULT_COMMAND")' --高度=50% --布局=反向
以下示例使用 fzf 作为 ripgrep 的选择器接口。我们将reload
操作绑定到change
事件,因此每次您键入 fzf 时,ripgrep 进程都会使用占位符表达式{q}
表示的更新后的查询字符串重新启动。另请注意,我们使用了--disabled
选项,以便 fzf 不执行任何二次过滤。
: | rg_prefix='rg --column --line-number --no-heading --color=always --smart-case' fzf --bind '开始:重新加载:$rg_prefix ""' --bind '更改:重新加载:$rg_prefix {q} ||真的' --bind '输入:成为(vim {1} +{2})' --ansi --禁用 --高度=50% --布局=反向
如果 ripgrep 没有找到任何匹配项,它将以非零退出状态退出,并且 fzf 会警告您。为了抑制警告消息,我们添加了|| true
命令,因此它总是以 0 退出。
有关更复杂的示例,请参阅“使用 fzf 作为交互式 Ripgrep 启动器”。
当设置--preview
选项时,fzf 会自动启动一个以当前行作为参数的外部进程,并在分割窗口中显示结果。您的$SHELL
用于通过$SHELL -c COMMAND
执行命令。可以使用鼠标或自定义键绑定滚动窗口。
# {} 替换为焦点行的单引号字符串 fzf --preview 'cat {}'
预览窗口支持 ANSI 颜色,因此您可以使用任何语法突出显示文件内容的程序,例如 Bat 或 Highlight:
fzf --preview 'bat --color=always {}' --preview-window '~3'
您可以使用--preview-window
选项自定义预览窗口的大小、位置和边框,并使用--color
选项自定义预览窗口的前景色和背景色。例如,
fzf --高度 40% --布局反向 --info 内联 --border --preview '文件 {}' --preview-window up,1,border-horizontal --bind 'ctrl-/:更改预览窗口(50%|隐藏|)' --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,预览-bg:#223344,边框:#778899'
有关选项的完整列表,请参阅手册页 ( man fzf
)。
可以在这里找到更高级的示例。
警告
由于 fzf 是通用文本过滤器而不是文件查找器,因此将--preview
选项添加到$FZF_DEFAULT_OPTS
并不是一个好主意。
# **********************# ** 不要这样做! **********************export FZF_DEFAULT_OPTS='--preview“bat --style=numbers --color=always --line-range :500 {}"'# bat 不适用于除文件列表之外的任何输入 sps -ef |弗兹夫 序列 100 | fzf历史|弗兹夫
fzf 可以使用以下协议之一在预览窗口中显示图像:
Kitty图形协议
iTerm2 内联图像协议
西塞尔
有关更多信息,请参阅 bin/fzf-preview.sh 脚本。
fzf --preview 'fzf-preview.sh {}'
.gitignore
您可以使用 fd、ripgrep 或 silver 搜索器来遍历文件系统,同时遵守.gitignore
。
# 将 fd 的输出输入 fzffd --type f --strip-cwd-prefix | fzf# 将 fd 设置为 fzfexport 的默认源 FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix'# 现在 fzf(无管道)将使用 fd 命令生成列表 fzf# 将命令应用于CTRL-T 以及export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
如果您希望该命令遵循符号链接并且不希望它排除隐藏文件,请使用以下命令:
导出 FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
与 bash 和 zsh 不同,fish 的CTRL-T
键绑定将使用命令行上的最后一个标记作为递归搜索的根目录。例如,在以下命令行末尾按CTRL-T
ls /var/
将列出/var/
下的所有文件和目录。
使用自定义FZF_CTRL_T_COMMAND
时,请使用未展开的$dir
变量来利用此功能。 $dir
默认为.
当最后一个标记不是有效目录时。例子:
set -g FZF_CTRL_T_COMMAND "命令 find -L $dir -type f 2> /dev/null | sed '1d; s#^./##'"
fzf Theme Playground 由 Vitor Mello 创建,是一个可以交互式创建 fzf 主题的网页。
https://github.com/junegunn/fzf/wiki/Related-projects
麻省理工学院许可证 (MIT)
版权所有 (c) 2013-2024 Junegunn Choi