后端汇总

fzf - 命令行模糊搜索神器

2019-07-26  本文已影响0人  Whyn

前言

fzf 是一款功能强大的命令行模糊搜索工具。

fzf 可以对文件,命令行历史记录,进程,主机名,标签,git 提交等进行模糊搜索。

fzf 的另一个常见的用处就是以插件形式集成到 Vim 上:fzf.vim

安装

这里简单介绍下源码安装:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf 
~/.fzf/install

更多安装方法,请查看:Installation

使用方法

find * -type f | fzf

fzf 如果没有接受标准输入流,那么就会直接进行文件查找(不包含隐藏文件),可以通过设置FZF_DEFAULT_COMMAND修改该默认动作):

fzf # 直接输入 fzf,打开文件搜索功能

:在 fzf 的用户交互界面中,用户的操作有如下动作可选:

  1. 使用CTRL-J/CTRL-K(或者CTRL-N/CTRL-P)进行上下选择
  2. 使用Enter选中条目,CTRL-C/CTRTRL-G/ESC进行退出操作
  3. 在多选择模式(-m),使用TABShift-TAB标记多个条目
  4. Emacs 风格按键绑定
  5. 支持鼠标操作
标记 匹配类型 描述
sbtrkt 模糊匹配 内容匹配sbtrkt(字符匹配)
'wild 精确匹配(单引号) 内容包含单词wild(单词匹配)
^music 前缀精确匹配 music开头
.mp3$ 后缀精确匹配 .mp3结尾
!fire 反转匹配 内容不包含fire
!^music 前缀反转匹配 不以music开头
!.mp3$ 后缀反转匹配 不以.mp3结尾

:如果不想使用模糊匹配或者不想"引用"每个文字,可以使用-e/--exact选项。注意如果使用-e/--exact,那么'就变成了解引用,即:'abc表示匹配a,bca,b,c有序),而不仅仅是匹配abc

^core go$ | rb$ | py$ # 表示以`core`开头,且以`go`或`rb`或`py`结尾

|前后必须带空格。

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>


# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>
# 为 rg 增加模糊补全,rg -F "def main(" **<TAB>
complete -F _fzf_path_completion -o default -o bashdefault rg
# 为 tree 增加模糊补全,tree  **<TAB>
complete -F _fzf_dir_completion -o default -o bashdefault tree

按键绑定

fzf 的安装脚本会为 bash,zsh 和 fish 终端设置以下按键绑定:

按键 描述
CTRL-T 命令行打印选中内容
CTRL-R 命令行历史记录搜索,并打印输出
ALT-C 模糊搜索目录,并进入(cd

其他

name description example
FZF_DEFAULT_COMMAND 输入为 tty 时的默认命令 export FZF_DEFAULT_COMMAND='fd --type f'
FZF_DEFAULT_OPTS 设置默认选项 export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"
FZF_CTRL_T_COMMAND 按键映射<CTRL-T>行为设置
FZF_CTRL_T_OPTS 按键映射<CTRL-T>选项设置
FZF_CTRL_R_OPTS 按键映射<CTRL-R>选项设置
FZF_ALT_C_COMMAND 按键映射<CTRL-C>行为设置
FZF_ALT_C_OPTS 按键映射<CTRL-C>选项设置
vim $(fzf --height 40%)

可以通过设置$FZF_DEFAULT_OPTS变量更改 fzf 默认行为:

# 设置 fzf 默认交互界面大小
export FZF_DEFAULT_OPTS='--height 40%' 
# Can select multiple processes with <TAB> or <Shift-TAB> keys
kill -9 <TAB>
ssh **<TAB>
telnet **<TAB>
# {} is replaced to the single-quoted string of the focused line
fzf --preview 'cat {}' # 预览文件内容
fzf --preview 'rg -F "def main(" -C 3 {}' # 预览 Python 文件 main 函数前后3行代码

高级配置

# 使用 rg 进行搜索
export FZF_DEFAULT_COMMAND='rg --files --hidden'
# 在交互界面选中文件后,按下 F1,直接使用 vim 打开
fzf --bind 'f1:execute(vim {})' 
# fuzzy grep open via ag
vg() {
  local file

  file="$(ag --nobreak --noheading $@ | fzf -0 -1 | awk -F: '{print $1}')"

  if [[ -n $file ]]
  then
     vim $file
  fi
}

1)首先先写目录搜索(fzf)并打印输出功能脚本:

# .bashrc
outputDir() {
    local dir
    dir=$(find ${1:-.} -type d 2> /dev/null | fzf +m)
    echo $dir
}

2)然后进行全局按键映射:

# .bashrc
bind '"\er": redraw-current-line'
bind '"\C-g\C-o": "$(outputDir)\e\C-e\er"'


1)\e\C-eshell-expand-line默认按键绑定,这是最容易的方式进行按键绑定,缺点就是它对于别名(alias)也会同样进行展开。
2)redraw-current-line:在非 tmux 终端上,该选项必须存在,否则无法清除提示。
3)先source .bashrc,然后按快捷键:<CTRL-G><CTRL-O>,运行结果如下:

fzf --preview '[[ $(file --mime {}) =~ binary ]] &&
                 echo {} is a binary file ||
                 (bat --style=numbers --color=always {} ||
                  highlight -O ansi -l {} ||
                  coderay {} ||
                  rougify {} ||
                  cat {}) 2> /dev/null | head -500'

结果如下:

1)首先自定义一个函数,使用 fzf 提供的 API:_fzf_complete提供补全功能:

# Custom fuzzy completion for "doge" command
#   e.g. doge **<TAB>
_fzf_complete_doge() {
  _fzf_complete "--multi --reverse" "$@" < <(
    echo very
    echo wow
    echo such
    echo doge
  )
}

2)在 bash 中,使用complete指令链接我们的自定义函数:

[ -n "$BASH" ] && complete -F _fzf_complete_doge -o default -o bashdefault doge

3)终端输入:doge **<TAB>,结果如下所示:

更多高级配置,请查看:wiki

总结

虽然好像写了挺多的,其实总结起来主要就 3 个操作:

参考

上一篇下一篇

猜你喜欢

热点阅读