linux利器之fzf | 定制满足需求 | 再也不用一个一个敲命令了

模糊匹配

  • 本文一直在强调 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 可以接受。
相关推荐
昨日的风10 分钟前
springboot 多数据源切换
后端
轻松Ai享生活14 分钟前
5 节课深入学习Linux Cgroups
linux
绝无仅有36 分钟前
mysql性能优化实战与总结
后端·面试·github
用户8356290780511 小时前
从手动编辑到代码生成:Python 助你高效创建 Word 文档
后端·python
christine-rr1 小时前
linux常用命令(4)——压缩命令
linux·服务器·redis
德育处主任1 小时前
玩转 Strands:AI Agent 开发,原来可以这么简单!
后端·aigc
Undoom1 小时前
大模型选型“炼狱”与终结:一份来自普通开发者的AI Ping深度评测报告
后端
用户4099322502121 小时前
FastAPI的CI流水线怎么自动测端点,还能让Allure报告美到犯规?
后端·ai编程·trae
双向331 小时前
Docker 镜像瘦身实战:从 1.2GB 压缩到 200MB 的优化过程
后端
三坛海会大神5551 小时前
LVS与Keepalived详解(二)LVS负载均衡实现实操
linux·负载均衡·lvs