Pet +fzf + glow 打造 CLI 端高效 Wiki

背景

首先看一下小项目完成之后的成果。
在这里插入图片描述
Pet 配合 glow 之后,可以在命令行输出 markdown

Pet 是一个命令行 snippet management 小工具。特别的实用。一切都是从它开始。Github 链接

使用 Pet 少说有 5 年了。它的作用就是将你常用的命令保存起来,然后你可以添加关键词,最后可以使用 fzf 或者 peco 搜索关键词来快速提取常用命令,提高效率。

配置和命令都会被保存到 toml 文件里,路径在 /home/usr/.config/pet/ 下。

安装很简单,看它的 Github 主页就行。使用 Pet 必须要安装 fzf

这里是一个原始 Pet 的使用截图。

在这里插入图片描述
你可以使用 <> 将保存动态的参数,Pet 可以自动匹配这样的 tag,然后让你输入所需的参数。
在这里插入图片描述

bash 或者是 zsh,都可以设置一个 aliasPet 的输出 pipexclip 就能保存命令,并且它还支持直接执行(pet exec)。

无尽的需求

首先我想保存一些简单的定义,比如什么是 TCP/IP 模型;或者是一些步骤类型的记录,比如如何在 ubuntu 上安装 docker-compose。诸如此类,我就不需要每次浏览网页,再开始操作了。简单高效很多。

问题是,原生 Pet 只能保存没有换行符(\n)的命令。意味着所有的命令或者记录必须在一行,稍长的记录在之后阅读起来就不是那么清晰,特别是步骤类型的。

我想了一下,需求的是可以在 pet new 的时候键入多行命令,并且可以使用 markdown,最后还需要在命令行直接输出 markdown,使整个流程做到最简化,并且还有很好的格式,阅读清晰。

修改源码

Pet 的源码也是很久没有维护了。为了我的需求,改起来。修改之后的源码在这里

整个过程搞得我对 GO 其实没有什么好感了,可能是系统原因(FreeBSD),按照 Pet 官方的步骤编译的话,第一步就会出错,最后花了一天时间整了自己的编译流程,算是大功告成了。

这是完成之后的 pet new 命令,支持多行输入。就像在命令行一样,使用 \ 来换行。
在这里插入图片描述
另外,也可以有简单的 markdown。

比如标题,行间代码,或者是表格。
在这里插入图片描述

注意,要使用 markdown,记住第一行输入必须以标题(#)开头,以及每行最后都是用 \ 续行就行。

这里的 markdown CLI 输入,要用到第二个小工具,glow

Github 链接

这个工具可以在命令行渲染 markdown,很好满足了我的需求。它的功能很多,具体见 Github。

另外,只要是 chrome 或者是 firefox 开头的命令,会直接执行。一些有用的工具类网站,直接保存在 Pet,然后在命令行搜索一下就能直接打开了。

编译

由于 knqyf263 (Pet 作者)的源码已经年久失修,gitlab 模块已经升级,我按照报错修改了 gitlab.go,但是未测试

官方使用 Makefile 的编译是会出错的,至少我的系统上是这样。所以我把我的编译方式写出来,如果大家无法使用官方的方式编译,那么就参考我这里的方法。

注意,编译前提是有梯子

# 不同类型的 proxy 自行修改
export https_proxy=proto://ip:addr
# 下载 go 1.14.1,测试通过的版本,版本不能更低(cobra command要求),但是高版本未测试
tar xvf go.tar -C /usr/local
export GOROOT=/usr/local/go/bin
export PATH=$PATH:$GOROOT
export GOPATH=/home//goprojs
mkdir -p $GOPATH/src/github.com/knqyf263
cd $GOPATH/src/github.com/knqyf263
git clone https://github.com/xillemi/pet.git
mkdir $GOPATH/bin
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
dep init
dep ensure -vendor-only
go mod vendor
# 二进制会安装到 $GOPATH/bin 目录
go install

有任何问题,欢迎私信。

最后,在 bashrc 或者 zshrc 中定义一个方法,来简化命令。

pets () {
cmd=`pet search`
# 如果命令是 # 开头,也就是 markdown 标题开头
# 会被 pipe 给 glow 显示在 terminal
# 其他的命令,会直接复制到剪切板,复制使用即可
if [[ "$cmd" == "#"* ]]
then
# !!!不要省略双引号噢,否则换行符都会被 strip 掉
# !!! markdown 表格就不能正常显示了
echo "$cmd" | glow -
else
echo "$cmd" | xclip -sel clip
fi
}

source ~/.bashrc
source ~/.zshrc

使用 pets 命令来高效工作吧。