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


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


日期作者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 <TAB> or <Shift-TAB> 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 **<TAB>
_fzf_complete_doge() {
  _fzf_complete "--multi --reverse" "$@" < <(
    echo very
    echo wow
    echo such
    echo doge
  )
}
  1. 在 bash 中, 使用complete指令链接我们的自定义函数:
[ -n "$BASH" ] && complete -F _fzf_complete_doge -o default -o bashdefault doge
  1. 终端输入: doge **<TAB>, 即可验证结果

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=‘fd --type f’
FZF_DEFAULT_OPTS设置默认选项 export FZF_DEFAULT_OPTS="–layout=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='--height 40%' 

3.6 预览窗口


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

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

3.7 高级配置


3.7.1 更改查找引擎


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

# 使用 rg 进行搜索
export FZF_DEFAULT_COMMAND='rg --files --hidden'

3.7.2 自定义命令


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

  • 通过快捷键执行外部程序
# 在交互界面选中文件后, 按下 F1, 直接使用 vim 打开
fzf --bind 'f1:execute(vim {})' 
  • 简化命令

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

# fuzzy grep open via ag
vg() {
  local file

  file="$(ag --nobreak --noheading $@ | fzf -0 -1 | awk -F: '{print $1}')"

  if [[ -n $file ]]
  then
     vim $file
  fi
}
  • 自定义全局快捷键触发

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

  1. 首先先写目录搜索(fzf)并打印输出功能脚本:
# .bashrc
outputDir() {
    local dir
    dir=$(find ${1:-.} -type d 2> /dev/null | fzf +m)
    echo $dir
}

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

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

注:

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

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


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

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

  1. 首先, 安装 bat 库. 具体步骤请查看文档.
  2. 终端输入以下内容:
fzf --preview '[[ $(file --mime {}) =~ binary ]] &&
                 echo {} is a binary file ||
                 (bat --style=numbers --color=always {} ||
                  highlight -O ansi -l {} ||
                  coderay {} ||
                  rougify {} ||
                  cat {}) 2> /dev/null | head -500'

结果如下:

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


4.1 Git 的好帮手


#---------------------
# modify by gatieme at 2021-02-01 20:47 for FZF
#---------------------
#export FZF_CTRL_T_OPTS="--layout=reserve --preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null | head -200'"
#export FZF_DEFAULT_OPTS="--height 99% -e --layout=reverse --preview '(highlight -O ansi -l {}' --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899'"
export FZF_DEFAULT_OPTS="--height 99% -e --layout=reverse --preview '(bat --style=numbers --color=always {} ||  highlight -O ansi -l {} || coderay {} || rougify {} || cat {}) 2> /dev/null '  --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899'"


function fview()
{
  fzf -e --layout=reserve --preview="~/.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="git show {+1}"
}

function gitblame()
{
  git blame $1 | fzf -e --layout=reverse --preview="git show {1}" $2
}

function gitcheckout()
{
  git checkout $(git branch -a) | fzf --preview="git log --oneline {1}"
}

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

4.2 VIM 大杀器


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

如果对FZF和vim和结合感兴趣可以看: 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

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

知识共享许可协议

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

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



已标记关键词 清除标记
相关推荐
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页