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 可以接受。
相关推荐
上进小菜猪4 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷5 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
充电zcx5 小时前
Linux:4:开发工具详解
linux·运维·服务器
考虑考虑5 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
步行cgn7 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
码农客栈9 小时前
linux 交叉编译tslib
linux
RISCV_Explorer9 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行9 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
JavaGuide9 小时前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
鱼月半9 小时前
两台电脑直连网络不通怎么办?
linux·网络协议