热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用模糊搜索神器FZF来提升办公效率

title:使用模糊搜索神器FZF来提升办公效率date:2021-02-1500:32author:gatiemetags:linuxcategories:-linux-debu

title: 使用模糊搜索神器 FZF 来提升办公效率
date: 2021-02-15 00:32
author: gatieme
tags: linux
categories:
- linux
- debug
thumbnail:
blogexcerpt: FZF 是目前最快的模糊搜索工具. 使用golang编写. 结合其他工具(比如 ag 和 fasd)可以完成非常多的工作. 前段时间, 有同事给鄙人推荐了 FZF, 通过简单的配置, 配合 VIM/GIT 等工具食用, 简直事半功倍, 效率指数级提升, 因此推荐给大家.


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

知识共享许可协议

因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 鄙人在此谢谢啦

转载请务必注明出处, 谢谢, 不胜感激



日期作者GitHubCSDNBLOG
2021-02-15成坚-gatiemeAderXCoding/system/tools/fzf使用模糊搜索神器 FZF 来提升办公体验Using FZF to Improve Productivit



1 fzf 介绍

fzf 是一款使用 GO 语言编写的交互式的命令行工具, 可以用来查找任何 列表内容、文件、历史命令、 本机绑定的host、 进程、 Git 分支、进程 等.

我们可以通过 FZF 结合 git 等工具来提升我们的办公体验.

github 仓库地址

https://github.com/junegunn/fzf

2 fzf 安装

FZF 目前已经在各大发行版的源中集成了, 比如 ubuntu 19.10 之后, 可以直接使用 apt 进行安装

Package ManagerLinux DistributionCommand
APKAlpine Linuxsudo apk add fzf
APTDebian 9+/Ubuntu 19.10+sudo apt-get install fzf
Condaconda install -c conda-forge fzf
DNFFedorasudo dnf install fzf
NixNixOS, etc.nix-env -iA nixpkgs.fzf
PacmanArch Linuxsudo pacman -S fzf
pkgFreeBSDpkg install fzf
pkg_addOpenBSDpkg_add fzf
XBPSVoid Linuxsudo xbps-install -S fzf
ZypperopenSUSEsudo zypper install fzf

当然也可以使用 git clone 的方式安装

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

关于更详细的安装方法可以参照 Installation

3 fzf 使用


3.1 FZF 基本使用



fzf 默认会启用用户交互查找, 从标准输入流(STDIN)读取, 并将匹配内容输出到标准输出流(STDOUT)中:

find * -type f | fzf

fzf 如果没有接受标准输入流, 那么就会直接进行文件查找(不包含隐藏文件), 可以通过设置 FZF_DEFAULT_COMMAND 修改该默认动作:

3.2 FZF 基本操作



fzf # 直接输入 fzf, 打开文件搜索功能

注: 在 fzf 的用户交互界面中, 用户的操作有如下动作可选:


  • 使用CTRL-J/CTRL-K(或者CTRL-N/CTRL-P)进行上下选择
  • 使用Enter选中条目, CTRL-C/CTRTRL-G/ESC进行退出操作
  • 在多选择模式(-m), 使用TAB和Shift-TAB标记多个条目
  • Emacs 风格按键绑定
  • 支持鼠标操作

3.3 搜索




3.3.1 搜索语法



fzf 默认会以 “extened-search” 模式启动, 这种模式下不支持正则搜索, 但是你可以输入多个搜索关键词, 以空格分隔, fzf 会无序查找匹配所有字符串.

如 ^music .mp3$, sbtrkt !fire.

fzf 提供了一些增强功能的搜索语法, 如下表所示:

标记匹配类型描述
sbtrkt模糊匹配内容匹配sbtrkt(字符匹配)
'wild精确匹配(单引号)内容包含单词wild(单词匹配)
^music前缀精确匹配以music开头
.mp3$后缀精确匹配以.mp3结尾
!fire反转匹配内容不包含fire
!^music前缀反转匹配不以music开头
!.mp3$后缀反转匹配不以.mp3结尾

注: 如果不想使用模糊匹配或者不想"引用"每个文字, 可以使用 -e/--exact 选项. 注意如果使用 -e/--exact, 那么 ' 就变成了解引用, 即:'abc表示匹配a,b和c(a,b,c有序), 而不仅仅是匹配abc.


3.3.2 或操作



fzf 以空格分隔, 默认使用的是 与 操作(无序), 如果想使用 或 操作, 那么可以使用 | :

^core go$ | rb$ | py$ # 表示以`core`开头, 且以`go`或`rb`或`py`结尾

注: | 前后必须带空格.


3.3.3 模糊补全



在 bash 或 zsh 终端上, 可以通过输入 ** 来触发 fzf 对文件/目录的模糊补全(查找), 如下例子所示:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

  • 进程 ID 模糊补全

在使用kill命令时, fzf 会自动触发其自动补全功能:

# Can select multiple processes with or keys
kill -9 <TAB>

  • 主机名补全

如下例子所示:

ssh **<TAB>
telnet **<TAB>

  • 自定义模糊补全

在 bash 上, fzf 的模糊补全功能只对一些预定义的命令集有效(具体命令集: complete | grep _fzf), 但是我们也可以为其他命令设置 fzf 模糊补全功能, 如下所示:

# 为 rg 增加模糊补全, rg -F "def main(" **<TAB>
complete -F _fzf_path_completion -o default -o bashdefault rg# 为 tree 增加模糊补全, tree **<TAB>
complete -F _fzf_dir_completion -o default -o bashdefault tree

fzf 目前有提供相关 API 供我们自定义模糊补全功能, 具体步骤如下:

  1. 首先自定义一个函数, 使用 fzf 提供的 API: _fzf_complete 提供补全功能:

# Custom fuzzy completion for "doge" command
# e.g. doge **
_fzf_complete_doge() {_fzf_complete "--multi --reverse" "$&#64;" < <(echo veryecho wowecho suchecho doge)
}

  1. 在 bash 中, 使用complete指令链接我们的自定义函数:

[ -n "$BASH" ] && complete -F _fzf_complete_doge -o default -o bashdefault doge

  1. 终端输入: doge **, 即可验证结果

3.4 按键绑定



fzf 的安装脚本会为 bash, zsh 和 fish 终端设置以下按键绑定:

按键描述
CTRL-T命令行打印选中内容
CTRL-R命令行历史记录搜索, 并打印输出
ALT-C模糊搜索目录, 并进入(cd)

3.5 环境变量




namedescription example
FZF_DEFAULT_COMMAND输入为 tty 时的默认命令 export FZF_DEFAULT_COMMAND&#61;‘fd --type f’
FZF_DEFAULT_OPTS设置默认选项 export FZF_DEFAULT_OPTS&#61;"–layout&#61;reverse --inline-info"
FZF_CTRL_T_COMMAND按键映射行为设置
FZF_CTRL_T_OPTS按键映射选项设置
FZF_CTRL_R_OPTS按键映射选项设置
FZF_ALT_C_COMMAND按键映射行为设置
FZF_ALT_C_OPTS按键映射选项设置

fzf 默认会以全屏方式显示交互界面, 可以使用–height选项设置交互界面高度:

vim $(fzf --height 40%)

可以通过设置$FZF_DEFAULT_OPTS变量更改 fzf 默认行为:

# 设置 fzf 默认交互界面大小
export FZF_DEFAULT_OPTS&#61;&#39;--height 40%&#39;

3.6 预览窗口



可以通过提供 --preview 选项打开预览窗口, 并设置响应命令输出到预览窗口上.

# {} is replaced to the single-quoted string of the focused line
fzf --preview &#39;cat {}&#39; # 预览文件内容
fzf --preview &#39;rg -F "def main(" -C 3 {}&#39; # 预览 Python 文件 main 函数前后3行代码

3.7 高级配置




3.7.1 更改查找引擎



默认情况下, fzf 使用的查找引擎是系统自带的 find 命令, 这里我们可以对其进行更改, 换成更高效的查找引擎.

# 使用 rg 进行搜索
export FZF_DEFAULT_COMMAND&#61;&#39;rg --files --hidden&#39;

3.7.2 自定义命令



我们可以通过设置按键映射在 fzf 交互界面直接开启外部进程 (execute, execute-silent) 运行我们选中的文件

  • 通过快捷键执行外部程序

# 在交互界面选中文件后, 按下 F1, 直接使用 vim 打开
fzf --bind &#39;f1:execute(vim {})&#39;

  • 简化命令

可以通过定义 shell 脚本简化 fzf 命令执行. 比如, 下面示例定义了一个函数, 结合ag实现传参进行模糊搜索, 并用 vim 打开:

# fuzzy grep open via ag
vg() {local filefile&#61;"$(ag --nobreak --noheading $&#64; | fzf -0 -1 | awk -F: &#39;{print $1}&#39;)"if [[ -n $file ]]thenvim $filefi
}

  • 自定义全局快捷键触发

像 fzf 其实已经有为我们提供了一些按键映射, 比如, 可以打印出选中文件. 现在我们也仿照写一个该功能脚本, 全局快捷键设为:

  1. 首先先写目录搜索(fzf)并打印输出功能脚本:

# .bashrc
outputDir() {local dirdir&#61;$(find ${1:-.} -type d 2> /dev/null | fzf &#43;m)echo $dir
}

2)然后进行全局按键映射:

# .bashrc
bind &#39;"\er": redraw-current-line&#39;
bind &#39;"\C-g\C-o": "$(outputDir)\e\C-e\er"&#39;

注:

  1. \e\C-e: shell-expand-line默认按键绑定, 这是最容易的方式进行按键绑定, 缺点就是它对于别名(alias)也会同样进行展开.
  2. redraw-current-line: 在非 tmux 终端上, 该选项必须存在, 否则无法清除提示.
  3. 先source .bashrc, 然后按快捷键: , 运行结果如下:


3.7.3 为预览窗口增加语法高亮:



预览窗口支持 ANSI 颜色, 因此我们可以为文件内容增加语法高亮. 我们借助 bat 这个库来为我们的文本显示语法高亮功能:

建议安装bat&#xff0c; 是一个Rust编写的独立程序
也可以安装rougify(先安装ruby, 然后gem intall rouge)


  1. 首先, 安装 bat 库. 具体步骤请查看文档.
  2. 终端输入以下内容:

fzf --preview &#39;[[ $(file --mime {}) &#61;~ binary ]] &&echo {} is a binary file ||(bat --style&#61;numbers --color&#61;always {} ||highlight -O ansi -l {} ||coderay {} ||rougify {} ||cat {}) 2> /dev/null | head -500&#39;

结果如下:

4 用 FZF 提升其他工具的效率


4.1 Git 的好帮手



#---------------------
# modify by gatieme at 2021-02-01 20:47 for FZF
#---------------------
#export FZF_CTRL_T_OPTS&#61;"--layout&#61;reserve --preview &#39;(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null | head -200&#39;"
#export FZF_DEFAULT_OPTS&#61;"--height 99% -e --layout&#61;reverse --preview &#39;(highlight -O ansi -l {}&#39; --color &#39;fg:#bbccdd,fg&#43;:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899&#39;"
export FZF_DEFAULT_OPTS&#61;"--height 99% -e --layout&#61;reverse --preview &#39;(bat --style&#61;numbers --color&#61;always {} || highlight -O ansi -l {} || coderay {} || rougify {} || cat {}) 2> /dev/null &#39; --color &#39;fg:#bbccdd,fg&#43;:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899&#39;"function fview()
{fzf -e --layout&#61;reserve --preview&#61;"~/.file_view.sh {$2} $1"
}function lsf()
{ls $1 | fview $1
}function cdf()
{cd $(fdfind --type directory | fzf)
}function gitlog()
{git log --oneline $* | fzf -e --multi --preview&#61;"git show {&#43;1}"
}function gitblame()
{git blame $1 | fzf -e --layout&#61;reverse --preview&#61;"git show {1}" $2
}function gitcheckout()
{git checkout $(git branch -a | fzf --preview&#61;"git log --oneline {1}")
}

当然大家可以使用别的大神已经集成好的配置 wfxr/forgit

4.2 VIM 大杀器



fzf 本身并不是一个vim 插件, 本来作者只提供了基本的wrapper函数(比如fzf#run). 但后来作者发现很多人并不熟悉 VIMScript, 所以就创建一个默认的 vim plugin.

如果对FZF和vim和结合感兴趣可以看&#xff1a; VIM与模糊搜索神器FZF的集成用法 - 从简单到高级

5 参考资料


5.1 中文资料



由于开始对于 FZF 不甚了解, 因此本博文较多参考了 fzf - 命令行模糊搜索神器 和 模糊搜索神器fzf. 在这里对这两位作者的成果表示尊重和感谢. 鄙人同一时间正在写其他技术博文, 为了保证其他博文的细致, 因此这篇略显粗糙, 敬请谅解.

FZF wiki

模糊搜索神器FZF番外篇

5.2 外文资料



Improving Vim Workflow With fzf

Using FZF to Improve Productivity

Boost Your Command-Line Productivity With Fuzzy Finder

Why you should be using fzf, the command line fuzzy finder

Improve Your Workflow in the Terminal with These fzf Tips



  • 本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017 ), 由 成坚(gatieme) 创作.

  • 采用知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme ), 不得用于商业目的.

  • 基于本文修改后的作品务必以相同的许可发布. 如有任何疑问, 请与我联系.

  • 转载请务必注明出处, 谢谢, 不胜感激


推荐阅读
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Docker网络基础探讨了如何通过高效的技术手段实现跨主机容器间的顺畅通信与访问。本文深入分析了Docker网络架构,特别是其在多主机环境下的应用,为Go语言开发者提供了宝贵的实践指导和理论支持。 ... [详细]
  • 黄聪:MySQL主从复制配置,实现高效读写分离
    大型网站为应对高并发访问,不仅需要在前端实现分布式负载均衡,还需在数据业务和访问层采取有效措施。采用传统的数据结构已无法满足需求,通过配置MySQL主从复制,可实现高效的读写分离,显著提升系统性能和稳定性。 ... [详细]
  • 在Ubuntu和Linux Mint系统中安装LibreOffice 6.0的详细步骤
    本文详细介绍了在Ubuntu和Linux Mint操作系统上安装LibreOffice 6.0的具体步骤,包括必要的系统准备、软件源配置以及命令行操作,确保用户能够顺利安装并使用这一开源办公套件。 ... [详细]
  • 在 Windows 10 系统下配置 Python 3 和 OpenCV 3 的环境时,建议使用 Anaconda 分发版以简化安装过程。Anaconda 可以从其官方网站(https://www.anaconda.com/download)下载。此外,本文还推荐了几本关于 Python 和 OpenCV 的专业书籍,帮助读者深入理解和应用相关技术。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 在Linux环境中,通过编写Shell脚本来实现自定义命令的创建与激活,能够极大地简化服务器上多个子系统的管理操作。例如,通过简单的命令如“tt”,即可快速查看各个应用程序的名称及其运行状态,从而提高系统维护的效率和便捷性。 ... [详细]
  • 算术表达式分析与解析技术初探
    本文初步探讨了算术表达式的分析与解析技术,针对作者在职业转型过程中发现自身算法基础薄弱的问题,决定在接下来的三个月内,系统地学习和掌握常用数据结构与算法,以提升个人技术能力。研究内容不仅涵盖了基本的算术表达式解析方法,还深入讨论了其在实际应用中的优化策略,为相关领域的进一步研究奠定了基础。 ... [详细]
author-avatar
从前泪流光e_446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有