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 可以接受。
相关推荐
Lary_Rock1 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
一坨阿亮4 小时前
Linux 使用中的问题
linux·运维
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust