模糊搜索神器FZF番外篇

模糊搜索神器FZF番外篇

Fuzzy finder

什么是模糊搜索?
广义的模糊搜索是指容许被搜索信息和搜索提问之间存在必定的差别,这种差别就是“模糊”在搜索中的含义。例如,查找名字Smith时,就会找出与之类似的Smithe, Smythe, Smyth, Smitt等。
但咱们这里模糊搜索特指搜索关键词离散且乱序。
看以下的搜索,个人关键词是“a t dir go 15 6”, 搜索到的结果是“app/go/test/fixedbugs/issue15609.dir/call_amd64.s”
vmplayer_2018-08-20_18-53-11
能够看到结果并非按照关键词顺序有序排列的php

为何要用Fuzzy finder

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

工具

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

为何选择FZF

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

FZF定位

FZF只是一个模糊搜索的命令行工具,它须要结合其余工具一块儿来用,它的输入要从其余工具获得,它的输出通常也是送给其余工具。node

有哪些工具能够方便的和FZF一块儿使用

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

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

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

如何和ripgrep一块儿使用

能够设置使用rg来获得文件列表json

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里能够写上vim

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>就能够进行相关rvapp

如何和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 file
   local dir
   file=$(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 branch
  branches=$(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和其余工具。
有任何有趣的点子,欢迎和本人分享

相关文章
相关标签/搜索