先上链接: https://github.com/werifu/complish
应用场景
参数补全:你在 shell 里输入命令后,按 Tab 键可以给你列出的子命令或者参数候选项,如下图

非常知名的 CLI 一般都会自带补全,但是很多 CLI 开发者并不提供该 CLI 在各种 shell 下的补全,每次使用的时候如果忘记参数了又要重新执行 cmd --help 去看帮助,非常影响体验。能够简单地为所有 CLI 生成补全的话就可以解决这个问题,如上图的补全就是由 complish 实现的,croc 的作者并没有提供。
原理
各个 shell ( bash 、zsh 、fish 、powershell )等都支持 completion 的语法,允许为命令增加自定义的参数补全,但是各家的语法并不相通,因此我只做了我用的 fish 版本,同时也相当于安利 fish 了吧: https://fishshell.com/😄
原理其实很简单,就是程序里靠执行 cmd --help 得到 help page 的文本,分析文本然后按 completion 语法去生成对应的 completion 脚本。然而难点在于 help page 并没有统一的规范,不同的框架、不同的语言都有不一样的写法,写出来的 help page 没有统一的严格结构,很难解析,因此 chatGPT 的出现真的是这个问题的救星,喂入 help page 的文本,生成一个该 help page 的结构化 json ,我就能很轻松地解析并生成补全文件。
我相信 chatGPT 拥有的 text to structure 的能力能很大程度改善生产生活的体验,这只是一个很小的应用场景
短板
- 解析速度取决于 openai 的接口返回速度,同时因为 openai 的接口频率限制,接口调用失败是大概率会出现的,因此代码中做了重试处理,也会影响时间。个人体验:只有几个参数的 CLI 大概 10 秒内完成解析,好几十个参数的可能超过 30 秒,只有一层子命令的一般会在一分钟内完成。
- 有些 CLI 的 help page 实在太长,chatGPT 吃不下。比如统计代码行数的 cloc 工具就会超出限制,因为有超过 400 行、6k+字符的 help……目前还没解决,但是绝大多数的情况下是 ok 的。
欢迎大家来使用体验!如果觉得好还请给个 ⭐️
