fzf 命令行文本增强工具使用
[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'