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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

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