[TOC]
介绍
fzf 的主要功能有 查找文件 历史命令查询 快速进入目录 文件预览
官方 wiki https://github.com/junegunn/fzf/wiki
官方源码地址https://github.com/junegunn/fzf
使用前注意
- fzf 本身没有运行依赖,但是依赖本地 CLI 环境,如果你是原生 bash 体验提升不会太大
 - fzf 某些功能需要 ruby 的支持,建议先调整好本地 ruby 环境
 
祝使用愉快
安装 fzf
我这里使用了 zsh + oh-my-zsh 怎么安装见 https://www.jianshu.com/p/0d265d9f914b
# for Mac
# install fd & fzf
$ brew install fd fzf
# bind default key-binding 这里会提示你绑定默认快捷键
$ /usr/local/opt/fzf/install
# 输出这个命令后,根据提示一路回车
# 生效配置
$ source ~/.zshrc
# alter filefind to fd 设置环境变量,如果已经自动设置了,就不用重复设置
$ vim ~/.zshrc
export FZF_DEFAULT_COMMAND='fd --type file'
export FZF_CTRL_T_COMMAND=$FZF_DEFAULT_COMMAND
export FZF_ALT_C_COMMAND="fd -t d . "
$ source ~/.zshrc
# 修改自定义快捷键
# Ctrl+R History command; Ctrl+R file catalog
# if you want to DIY key of like 'Atl + C'
# maybe line-num is not 65, but must nearby 在 65 行或者附近,找到后改一下
$ vim /usr/local/opt/fzf/shell/key-bindings.zsh
- 65 bindkey '\ec' fzf-cd-widget
+ 65 bindkey '^\' fzf-cd-widget
# 生效改动
$ source /usr/local/opt/fzf/shell/key-bindings.zsh
注意这里把 快速进入目录 alt+c 快键改为
ctrl+\这样可以区分一下 容易按错的 alt+c
fzf默认环境变量
FZF_DEFAULT_ COMMAND
设定默认输入
比如 `export FZF_DEFAULT_ COMMAND='ag -g ""'FZF_DEFAULT_OPTS
设定默认选项
比如`export FZF_DEFAULT_OPTS="--reverse --inline-info"
fzf 常用操作
fz f默认会从 STDIN 读入数据,然后将结果输出到 STDOUT
# 从find的搜索结果中读入,输出到文件 fzfSelected 中
find * -type f | fzf > fzfSelected
fzf 常用快捷键
- 
ctrl-K/ctrl-P可以用来将光标上移动 - 
ctrl-J/ctrl-N可以用来将光标下移动 - enter 键用来选中条目
 - ctrl-C/ctrl-G/Esc 用来退出
 - 在
多选模式下(-m), TAB 和 Shift-TAB 用来多选 - 鼠标: 上下滚动
 - 鼠标: 选中, 双击
 - shift-click 或 shift-scoll 用于多选模式
 
搜索语法
fzf默认会以 extened-search 模式启动, 这种模式下你可以输入多个以空格分隔的搜索关键词
| Token | Match type | Description | 
|---|---|---|
| sbtrkt | fuzzy-match | 匹配sbtrkt | 
| ^music | prefix-exact-match | 以music开头 | 
| .mp3$ | suffix-exact-match | 以.mp3结尾 | 
| 'wild | exact-match(quoted) | 精确包含wild | 
| !fire | inverse-exact-match | 不包含fire(取反) | 
| !.mp3$ | inverse-suffix-exact-match | 不以.mp3结尾 | 
如果你不想用fuzzy match, 可以用
- 
fzf -e做精确匹配 - 
|做or匹配 比如,^core go$|rb$|py$ 
快速预览历史命令 ctrl-r
这个会覆盖原有命令行的历史命令,不过确实好用
在命令行下按下ctrl-r, fzf会列出history命令,选中条目并离开fzf的话, 选中条目会被拷到命令行上
如果想在 zsh 种执行可以这样配置 ~/.fzf
fzf-history-widget-accept() {
  fzf-history-widget
  zle accept-line
}
zle -N fzf-history-widget-accept
bindkey '^X^R' fzf-history-widget-accept
快速选择目录条目 ctrl-t
命令行下按下ctrl-t会打开fzf窗口,如果你选中某个条目并按下Enter, 选中的条目会被拷贝到命令行上
如果想同时预览文件内容,可以使用 --preview 选项
export FZF_CTRL_T_OPTS="--preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null | head -200'"
也可以用
--select-1 如果只有一个条目,那么自动选中并退出fzf
--exit-0 如果条目为空,自动退出
这两个选项对快速进入目录 默认快捷键 alt-c 也适用(当然被我们改成
ctrl+\)
命令行下的模糊完成
默认可以通过 ** 来触发文件或目录的自动完成
比如
vim **<tab>
# 输入 vim ** 按下 tab 键
vim ../multi**<TAB>
快速进入目录 alt-c [快捷键已经改为 ctrl+\]
在命令行上按下 alt-c, 会列出当前文件夹下的目录,选中条目会自动进入到相应目录
fzf快速预览Preview
利用fzf --preview 完成对文件的预览
安装 rougify coderay(先安装ruby)
gem install rouge
gem install coderay
# set alias
$ vim ~/.zshrc
fzfp() {
    fzf --preview '[[ $(file --mime {}) =~ binary ]] && echo {} is a binary file || (rougify {} || highlight -O ansi -l {} || coderay {} || cat {}) 2> /dev/null | head -500'
}
alias pp='fzf --preview '"'"'[[ $(file --mime {}) =~ binary ]] && echo {} is a binary file || (highlight -O ansi -l {} || coderay {} || rougify {} || cat {}) 2> /dev/null | head -500'"'"
$ source ~/.zshrc
# 使用方法,目录直接键入 pp
# 使用 ctrl-J/ctrl-K/ctrl-N/ctrlk-N可以用来将光标上下移动
# enter 键用来选中条目
# ctrl-c/ctrl-g/Esc 用来退出
预览功能文档见 https://github.com/junegunn/fzf
fzf 美化
修改布局
fzf默认全屏模式,你可以定制高度
vim $(fzf --height 40%)
或者 通过 $FZF_DEFAULT_OPTS 来设定默认值
export FZF_DEFAULT_OPTS='--height 40% --reverse --border'