菜单

概述

相关源文件

fzf 是一个通用的命令行模糊查找器,它为任何列表数据提供了一个交互式的过滤界面。它实现了一个模糊匹配算法,允许用户通过键入包含省略字符的模式来查找项目,这使得它非常适合快速过滤大量数据集,如文件、命令历史、进程、主机名、git 提交等。

本文档提供了 fzf 架构、核心系统和集成能力的总体概述。有关特定组件的更详细信息,请参阅其各自的文档页面。

核心架构

fzf 的架构由几个关键组件组成,它们协同工作以提供其功能。

核心组件图

核心架构围绕以下主要组件展开

  • 终端界面:处理用户输入和显示输出,提供用户和 fzf 之间的接口
  • 匹配器:实现模糊匹配算法,根据用户输入过滤项目
  • 读取器:处理来自各种来源(标准输入、文件、命令)的输入
  • 模式处理:解释搜索模式和查询语法
  • 选项:配置所有组件的行为
  • 事件框:充当连接组件的中央事件总线

来源: README.md28-35 README.md373-400

数据流图

fzf 中的数据流遵循以下步骤

  1. 从各种来源(标准输入、文件、命令)读取输入
  2. 读取器将此输入处理成可管理的块
  3. 用户输入(查询字符串)由终端捕获并由模式构建器处理
  4. 匹配器使用查询和输入块应用模糊匹配算法
  5. 匹配结果由合并器处理
  6. 终端 UI 显示结果并处理用户交互
  7. 完成后,选定的项目将输出或由操作处理

来源: README.md253-288 README.md373-400

搜索功能

fzf 的核心是其模糊搜索系统,它允许灵活的模式匹配。

搜索语法

fzf 的默认搜索模式是“扩展搜索模式”,它支持复杂的模式匹配

标记匹配类型描述
sbtrkt模糊匹配匹配 sbtrkt 的项目
'wild精确匹配(引用)包含 wild 的项目
'wild'精确边界匹配(带引号)在单词边界处包含 wild 的项目
^music前缀精确匹配music 开头的项目
.mp3$后缀精确匹配.mp3 结尾的项目
!fire反向精确匹配不包含 fire 的项目
!^music反向前缀精确匹配不以 music 开头的项目
!.mp3$反向后缀精确匹配不以 .mp3 结尾的项目
``OR 操作符

来源: README.md373-400

评分方案

fzf 支持不同的计分方案,针对不同类型的输入进行了优化

方案描述
--scheme=default通用方案,旨在与任何类型的输入都能很好地配合
--scheme=path适用于文件路径,优先匹配路径分隔符后的内容
--scheme=history适用于命令历史,其中按时间顺序排序很重要

来源: README.md720-733

用户界面系统

fzf 提供了一个丰富的终端用户界面,具有许多自定义选项。

UI 架构

显示模式

fzf 提供几种显示模式以适应不同的用例

  • 全屏模式(默认):占用整个终端窗口
  • 高度限制模式--height):在光标下方显示,并指定高度
    fzf --height 40%
    
  • tmux 模式--tmux):在 tmux 弹出窗口中打开
    fzf --tmux center,80%,40%
    

来源: README.md308-371

UI 组件

界面由以下部分组成

  • 主列表区:显示过滤后的项目,带有可自定义的指针/标记
  • 查询输入行:显示搜索提示和用户输入
  • 预览窗口:用于显示项目预览的可选窗口
  • 信息行:显示匹配统计信息和其他信息
  • 边框和标签:围绕各种 UI 部分的可自定义边框

来源: README.md416-468 README.md427-442

Shell 集成

fzf 包含强大的 shell 集成功能,可增强命令行体验。

Shell 集成架构

键绑定

fzf 为常见任务提供了方便的键绑定

  • CTRL-T:将选定的文件/目录粘贴到命令行
    • 默认使用 --walker file,dir,follow,hidden
    • 可通过 $FZF_CTRL_T_COMMAND 和 $FZF_CTRL_T_OPTS 进行自定义
  • CTRL-R:搜索命令历史
    • 在相关性和时间顺序之间切换
    • 可通过 $FZF_CTRL_R_OPTS 进行自定义
  • ALT-C:更改为选定的目录
    • 默认使用 --walker dir,follow,hidden
    • 可通过 $FZF_ALT_C_COMMAND 和 $FZF_ALT_C_OPTS 进行自定义

来源: README.md492-540

模糊补全

fzf 通过模糊匹配功能扩展了 shell 补全。

  • 默认使用 ** 触发(可通过 $FZF_COMPLETION_TRIGGER 自定义)
  • 适用于文件、进程 ID、主机名、环境变量
  • 可通过 _fzf_compgen_path() 和 _fzf_compgen_dir() 为特定命令进行自定义
  • 支持使用 _fzf_setup_completion 为任何命令进行自定义补全

来源: README.md544-710

集成生态系统

fzf 可以与各种其他工具集成,创建一个广泛的生态系统。

集成生态系统架构

Vim/Neovim 集成

fzf 提供了一个 Vim 插件,为编辑器提供了模糊查找功能

  • junegunn/fzf 提供核心库函数
    • fzf#install() 确保提供最新二进制文件
  • junegunn/fzf.vim 提供各种有用的命令
  • 支持浮动窗口、弹出窗口和 tmux 集成

来源: README.md221-240

tmux 集成

fzf 通过 --tmux 选项提供原生 tmux 集成

fzf-tmux 脚本也适用于旧版 tmux 或更复杂的用例。

来源: README.md341-362

HTTP API

fzf 可以启动一个 HTTP 服务器,允许外部控制

  • 使用 --listen [HOST:]PORT 选项启动
  • 通过 HTTP POST 请求发送操作
  • 通过 HTTP GET 请求查询当前状态
  • 使用 $FZF_API_KEY 环境变量进行安全保护

来源: CHANGELOG.md1142-1162

配置与自定义

fzf 提供广泛的配置选项

环境变量

  • FZF_DEFAULT_COMMAND:用于生成输入的默认命令
  • FZF_DEFAULT_OPTS:应用于每个 fzf 命令的默认选项
  • FZF_DEFAULT_OPTS_FILE:配置文件位置

来源: README.md392-415 man/man1/fzf.11192-1207

键/事件绑定

fzf 提供了一个丰富的系统,用于将键和事件绑定到操作

  • 通过 --bind 选项进行自定义键映射
  • 事件驱动的操作(开始、更改、焦点等)
  • 大量的操作(执行、重新加载、预览、转换等)

来源: man/man1/fzf.11344-1769

总结

fzf 凭借其速度、灵活性和可扩展性,成为一款强大的命令行工具。其核心的模糊查找功能得到了丰富的功能集的补充,这些功能与 shell 环境和其他工具能够很好地集成。了解其架构和组件交互有助于用户充分发挥其潜力,提高命令行生产力。

来源: README.md27-33