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 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
DY009J11 分钟前
深度探索Kali Linux的精髓与实践应用
linux·运维·服务器
程序员-珍22 分钟前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
2401_854391081 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
码农小白1 小时前
linux驱动:(22)中断节点和中断函数
linux·运维·服务器
4647的码农历程1 小时前
Linux网络编程 -- 网络基础
linux·运维·网络
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
这孩子叫逆2 小时前
Spring Boot项目的创建与使用
java·spring boot·后端
C++忠实粉丝2 小时前
Linux环境基础开发工具使用(2)
linux·运维·服务器