模糊搜索神器FZF番外篇

Fuzzy finder

什么是模糊搜索?
广义的模糊搜索是指允许被搜索信息和搜索提问之间存在一定的差异,这种差异就是“模糊”在搜索中的含义。例如,查找名字Smith时,就会找出与之相似的Smithe, Smythe, Smyth, Smitt等。
但我们这里模糊搜索特指搜索关键词离散且乱序。
看如下的搜索,我的关键词是“a t dir go 15 6”, 搜索到的结果是“app/go/test/fixedbugs/issue15609.dir/call_amd64.s”

可以看到结果并不是按照关键词顺序有序排列的

为什么要用Fuzzy finder

  • 让工具像有灵魂一样
  • 节省你的宝贵时间
  • 输入更少,实际做的更多
  • 自动处理

工具

最出名的fizzy finder当然是FZF, 这位韩国大神Junegunn Choi写的几个小工具都很神,证明了一个道理:牛人出品质量有保障。

为什么选择FZF

  • FZF非常酷,它是一个组合性的命令行工具
  • 是用Go写的,非常快
  • 异步运行,能够处理非常大数量级的数据而不对调用工具产生影响
  • 可以非常多的方面帮助你,而不仅仅是用来查找文件
  • 移植容易(无信赖), 灵活的窗口配置
  • vim集成

FZF定位

FZF只是一个模糊搜索的命令行工具,它需要结合其他工具一起来用,它的输入要从其他工具得到,它的输出一般也是送给其他工具。

有哪些工具可以方便的和FZF一起使用

目前比较多的是以下几个工具

  • Find (目录搜索)
  • Grep (文本搜索)
  • Ag (文本搜索)
  • fd (目录搜索)
  • ripgrep (文本搜索)

后两个是最新出的两个搜索方面的新秀,应该是目前速度最快的。

如何和ripgrep一起使用

可以设置使用rg来得到文件列表

export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!{.git,node_modules}/*" 2> /dev/null'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND="rg --sort-files --files --null 2> /dev/null | xargs -0 dirname | uniq"

在.vimrc里可以写上

let g:rg_command = '\ rg --column --line-number --no-heading --fixed-strings --ignore-case --no-ignore --hidden --follow --color "always"\ -g "*.{js,json,php,md,styl,jade,html,config,py,cpp,c,go,hs,rb,conf}"\ -g "!{.git,node_modules,vendor}/*" 'command! -bang -nargs=* F call fzf#vim#grep(g:rg_command .shellescape(<q-args>), 1, <bang>0)

这样你在vim里输入:F <key word>就可以进行相关rv

如何和fd一起使用

也可以设置用fd来得到文件列表,因为fd和rg的walkthrough代码是共享的,所以速度基本一样

export FZF_DEFAULT_COMMAND='fd --type f --color=never'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND="fd --type d --color=never"

注意如果用time来比较rg和fd的速度时,往往会得出rg比fd快的结论,其实这是因为fd会彩色输出结果。
如果用fd --type f --color=neverrg --files来比较的话,结果基本是一样的

和各种shell配合

比如下面进入所选文件所在文件夹

# cdf - cd into the directory of the selected file
cdf() {local filelocal dirfile=$(fzf +m -q "$1") && dir=$(dirname "$file") && cd "$dir"
}

比如执行历史命令

fh() {eval $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
}

比如checkout git分支

# fbr - checkout git branch (including remote branches), sorted by most recent commit, limit 30 last branches
fbr() {local branches branchbranches=$(git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format="%(refname:short)") &&branch=$(echo "$branches" |fzf-tmux -d $(( 2 + $(wc -l <<< "$branches") )) +m) &&git checkout $(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##")
}

总结

FZF其实是胶水工具,它需要读入其他工具的输出做为输入,然后或者调用其他工具读取它的输出,或者把自己的输出送给其他工具作为输入。
理解了这一点就能够很好的结合fzf和其他工具。
有任何有趣的点子,欢迎和本人分享

模糊搜索神器FZF番外篇相关推荐

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

    title: 使用模糊搜索神器 FZF 来提升办公效率 date: 2021-02-15 00:32 author: gatieme tags: linux categories: - linux - ...

  2. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

  3. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  4. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81) 之前一直用的原生的centos7的源镜像安装虚拟机,然 ...

  5. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

    1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec  内存限制: 64 MB                                               ...

  6. 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏

    为什么80%的码农都做不了架构师?>>>    转自:http://blog.csdn.net/pongba/archive/2008/09/21/2958094.aspx 数学之美 ...

  7. 教你从0到1搭建秒杀系统-Canal快速入门(番外篇)

    Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能会用到.本篇介绍一下数据库中间件Canal的使用. 很多时候为了缩短调用延时,我们会对部分接口数据加入了缓存.一旦这些数据 ...

  8. 文本分类入门(番外篇)特征选择与特征权重计算的区别

    文本分类入门(番外篇)特征选择与特征权重计算的区别 在文本分类的过程中,特征(也可以简单的理解为"词")从人类能够理解的形式转换为计算机能够理解的形式时,实际上经过了两步骤的量化- ...

  9. 5年前面试题引发的“血案”(番外篇)(总结和乱侃)

    这货是说好的番外篇-- 所谓的番外篇其实就是对前面的各个知识点做一些总结. 血案(1)中的两个内容主要是日志切换时的检查点和表空间管理. 日志切换其实远远没有简单,有关于检查点和日志文件的内容太多了, ...

最新文章

  1. [转载]IT知识体系结构图
  2. android java file 清理垃圾获取文件大小 删除文件等操作
  3. 【Linux】一步一步学Linux——halt命令(196)
  4. hashmap为什么线程不安全_面试官:你说 HashMap 线程不安全,它为啥不安全呢?...
  5. Leetcode--50. Pow(x,y)
  6. JAVA入门级教学之(数据类型)
  7. JPM Coin三部曲 (上) :深入理解摩根幣的運作
  8. 预定义类型未定义或导入_LimeSurvey基础教程(二)——问题类型
  9. python数据分析之(7)简单绘图pylab
  10. IMO FTPC Part 3-A、B和F级分隔耐火性能测试
  11. jQuery选择器 第六章
  12. java jvm理解_【java】之深入理解JVM
  13. 第七届山东理工大学ACM趣味编程循环赛 Round#1 sdut4109 玄黄的字符串
  14. 品牌公寓+电子合同,开拓年轻人租房市场
  15. MMORPG摄像机操作
  16. Machine Learning | (1) Scikit-learn与特征工程
  17. Windows Server 2012R2 启用网络发现失败
  18. 微信内测朋友圈内容转发功能;快手前副总裁侵占756万余元,一审获刑7年;​俄罗斯法院驳回苹果上诉,将继续进行反垄断调查|极客头条
  19. 华为2017实习生面试
  20. Windows 11:面子仿苹果,里子反苹果

热门文章

  1. C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
  2. poj3320 尺取法 挑战程序设计竞赛
  3. 流水线的吞吐量,加速比,效率的计算
  4. 正则表达式:贪婪匹配与非贪婪匹配
  5. Python爬虫之puppeteer之遇到的bug及解决方法
  6. 关于Ubuntu中 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)解决方案
  7. Qt:Windows编程—Qt实现本地服务管理
  8. jQeury 批量删除
  9. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
  10. 业内人士惊暴网络求职黑幕!