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'

参考
如何给码农的Mac开光
模糊搜索神器fzf

推荐阅读更多精彩内容

  • fzf是目前最快的fuzzy finder。使用golang编写。结合其他工具(比如ag和fasd)可以完成非常多...
    佛心看世界阅读 987评论 0 2
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 3,779评论 0 10
  • 返回上次光标的位置Ctrl+Alt+ left/right 返回至上次浏览的位置 Alt+回车 导入包,自动修正C...
    请叫我四爷阅读 868评论 1 2
  • 左手拿起碗,打上洗洁精,右手拿起抹布,沿碗廓慢慢抹一圈,小心翼翼地把碗翻过来,沿碗底让布再旋转一圈。我每天帮忙...
    Keizer阅读 82评论 2 2
  • 最近看了丁云生的《重疾不重》,对于才知道重大疾病和我们的关系,才知道重疾险对于我们的重要作用。 曾经有一位肿瘤专家...
    蒋莹阅读 56评论 0 0