模糊匹配
- 本文一直在强调 fzf 的最大特色就是快速的模糊搜索能力。我们在上面三个快捷键中已经见识了它的搜索能力。除了快捷键调用窗口选择以外,他也是支持在命令中进行模糊搜索的。
跳转
- 电脑文件特别多,我现在想去
~/shell
目录下的一个叫protools
目录的路径,但是完整的路径忘记了。如果是之前我们只能一个一个试试,或者通过find
命令查找。也许你先学先用说我们可以使用上面的Ctrl+T
快捷键
- 没错,现学现用肯定是没问题的,但是你会发现我需要先到
~/shell
目录,这个相当于多了一步了。而fzf
直接支持cd
命令模糊搜索。
- 这里我们需要注意
fzf
会识别路径的正确性。比如上面识别~/shell
是一个正常的路径,所以就不会在搜索框中体现。接下来我们输入一个~/shell/hello/protools**
你会发现hello/protools
作为条件搜索了。
- 类似的还有
vim
也是支持类似的语法的。
杀掉进程
- 不知道你有没有烦恼过每次啥进程需要我们 ps 查看后,在
kill -9 pid
。麻烦、麻烦、麻烦。但是有了 fzf 就不一样了的。
bash
kill -9 **<TAB>
- 通过 fzf 我们只需要知道 pid 后就可以输入大概 pid 就行了。这个就得看个人了,因为操作不仔细可能误删其他进程。
远程连接
- 公司项目特别多,如果不使用特殊的连接工具管理的话,使用命令行
ssh
连接将会特别的麻烦。有了 fzf 我们就可以模糊搜索了,它的搜索来源是/etc/hosts
和~/.ssh/config
文件中配置的域名才可以。这里需要注意也仅仅针对域名的连接。
环境变量
shell
unset **<TAB>
export **<TAB>
unalias **<TAB>
定制配置
shell
# 使用`~~`代替**
export FZF_COMPLETION_TRIGGER='~~'
# fzf 的可选项
export FZF_COMPLETION_OPTS='--border --info=inline'
# fd 替代find
_fzf_compgen_path() {
fd --hidden --follow --exclude ".git" . "$1"
}
_fzf_compgen_dir() {
fd --type d --hidden --follow --exclude ".git" . "$1"
}
_fzf_comprun() {
local command=$1
shift
case "$command" in
cd) fzf --preview 'tree -C {} | head -200' "$@" ;;
export|unset) fzf --preview "eval 'echo \$'{}" "$@" ;;
ssh) fzf --preview 'dig {}' "$@" ;;
*) fzf --preview 'bat -n --color=always {}' "$@" ;;
esac
}
- 定制的函数刷新后可以直接运行
shell
_fzf_comprun cd
脚本定制
- 接下来就是我们如何使用 fzf 来构建我们的功能了。比如我想实现一个
ps -ef
列表,并且绑定快捷键刷新
shell
ps -ef |
fzf --bind 'ctrl-r:reload(ps -ef)' \
--header 'Press CTRL-R to reload' --header-lines=1 \
--height=50% --layout=reverse
-
我们可以在
zshrc
中创建对应的方法并且绑定快捷键就可以实现了。 -
具体的脚本这里不掩饰了,官方 github 给出了很多的 demo , 感兴趣的可以一个一个试试。
选择删除文件
- 官方给的 demo 足以给我灵感自己创作符合自己需求的脚本了。我们使用可视化桌面操作的应该很熟悉删除文件操作。选择文件然后右键删除。
- 这个功能借助 fzf 我们可以实现简易版的删除功能。实现之前我们先看看使用 fzf 加载文件的功能。
bindkey -s '\e[17~' '_fzf_ps\n'
shell
ll | fzf
- 这是一个简单的接收功能。将 ll 下的结果全部已 fzf 进行渲染
- 接着我们选中其中一个文件看看输出的是什么内容。
- 针对这个输出我们还需要进行切割下。切割我想到了
awk
shell
ll | fzf | awk '{print $NF}
- 获取到文件之后我们就可以借助
xargs
进行删除了。所以最终完整的脚本是
shell
ll | fzf | awk '{print $NF} | xargs rm -rf
- 到这里我们就完成了删除选中文件的功能了。仔细观察下还是能够发现其中的 BUG 的,比如说如果 ll 的是其他目录,那么该脚本就会出错。
- 不足的地方就是不能批量删除。这些都是可以继续完善的。我这里就是抛砖引玉一下。
问题追踪
Tmux 环境第一次需要手动刷新
- 每次通过 tmux 创建一个新的 session 后都需要我们手动执行
source ~/.zshrc
。这个小 BUG 可以接受。