golang用Go编写bash自动补全脚本的插件库complete的使用
golang用Go编写bash自动补全脚本的插件库complete的使用
Package complete是一个用于bash自动补全和Go的完整解决方案。
基本介绍
complete包提供了在Go中编写bash自动补全脚本的功能,它支持:
- 命令和子命令的自动补全
- 标志(flags)的自动补全
- 参数值的动态补全
- 自定义补全逻辑
安装
go get github.com/posener/complete
示例代码
下面是一个完整的示例,展示如何使用complete库为Go程序添加bash自动补全功能:
package main
import (
"github.com/posener/complete"
)
func main() {
// 创建一个新的命令
cmd := &complete.Command{
// 命令名称
Sub: complete.Commands{
// 子命令
"install": &complete.Command{
Flags: complete.Flags{
// 子命令的标志
"-f": complete.PredictNothing,
"--force": complete.PredictNothing,
},
Args: complete.PredictFiles("*.go"), // 参数补全.go文件
},
"remove": &complete.Command{
Flags: complete.Flags{
"-r": complete.PredictNothing,
"--recursive": complete.PredictNothing,
},
Args: complete.PredictFunc(func(args complete.Args) []string {
// 自定义补全函数,返回可用的选项
return []string{"package1", "package2", "package3"}
}),
},
},
Flags: complete.Flags{
// 全局标志
"-v": complete.PredictNothing,
"--verbose": complete.PredictNothing,
},
GlobalFlags: complete.Flags{
// 全局标志(对所有子命令有效)
"-h": complete.PredictNothing,
"--help": complete.PredictNothing,
},
}
// 运行complete
complete.New("mycmd", cmd).Run()
}
如何使用
- 首先编写你的Go程序,并集成complete库
- 编译程序
- 在bash中执行以下命令启用自动补全:
source <(your-program -complete-install-bash)
或者将补全脚本永久添加到你的bash配置中:
echo "source <(your-program -complete-install-bash)" >> ~/.bashrc
补全预测器
complete提供了多种内置的补全预测器:
PredictNothing
: 不提供任何补全PredictFiles("*.go")
: 补全匹配模式的文件PredictDirs("*")
: 补全目录PredictFunc(func(complete.Args) []string)
: 自定义补全函数PredictSet("a", "b", "c")
: 补全预定义的集合
高级用法
你还可以为不同的参数位置提供不同的补全逻辑:
cmd := &complete.Command{
Args: complete.PredictOr(
complete.PredictFiles("*.go"),
complete.PredictFunc(func(args complete.Args) []string {
if len(args.Completed) == 1 {
return []string{"special-value"}
}
return nil
}),
),
}
这个示例展示了如何根据已输入的参数数量来提供不同的补全建议。
注意事项
- 确保你的程序名称在PATH中可用
- 测试补全功能时,可能需要重新加载bash配置或打开新的终端
- complete也支持zsh和fish的自动补全
更多关于golang用Go编写bash自动补全脚本的插件库complete的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang用Go编写bash自动补全脚本的插件库complete的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Go编写Bash自动补全脚本 - complete库指南
complete
是一个Go语言库,用于为命令行程序生成Bash自动补全脚本。下面我将详细介绍如何使用这个库。
安装complete库
首先安装complete库:
go get github.com/posener/complete
基本使用方法
1. 创建简单的自动补全
package main
import (
"github.com/posener/complete"
)
func main() {
// 创建命令对象
cmd := &complete.Command{
// 命令名称
Sub: complete.Commands{
"install": complete.Command{
// 子命令的flag
Flags: complete.Flags{
"--version": complete.PredictAnything,
"--force": complete.PredictNothing,
},
// 子命令的参数
Args: complete.PredictFiles("*.go"),
},
"remove": complete.Command{
// 预测已安装的包名
Args: complete.PredictFunc(predictInstalledPackages),
},
},
// 全局flag
Flags: complete.Flags{
"--help": complete.PredictNothing,
"--verbose": complete.PredictNothing,
},
}
// 运行自动补全
complete.New("myapp", cmd).Run()
}
// 自定义预测函数
func predictInstalledPackages(prefix string) []string {
// 这里应该实现获取已安装包列表的逻辑
// 返回与prefix匹配的包名
return []string{"package1", "package2", "package3"}
}
2. 生成补全脚本
要让Bash能够使用自动补全,需要生成补全脚本:
package main
import (
"fmt"
"github.com/posener/complete"
)
func main() {
// 创建命令对象
cmd := &complete.Command{
Sub: complete.Commands{
"build": complete.Command{
Flags: complete.Flags{
"-o": complete.PredictFiles(""),
},
Args: complete.PredictFiles("*.go"),
},
},
}
// 生成补全脚本
fmt.Println(complete.New("myapp", cmd).Bash())
}
运行这个程序会输出Bash补全脚本,你可以将其保存到/etc/bash_completion.d/
或~/.bash_completion
中。
高级功能
1. 动态预测
cmd := &complete.Command{
Sub: complete.Commands{
"connect": complete.Command{
Args: complete.PredictFunc(func(prefix string) []string {
// 动态获取服务器列表
return getAvailableServers(prefix)
}),
},
},
}
2. 嵌套子命令
cmd := &complete.Command{
Sub: complete.Commands{
"database": complete.Command{
Sub: complete.Commands{
"backup": complete.Command{
Args: complete.PredictFiles("*.db"),
},
"restore": complete.Command{
Args: complete.PredictFiles("*.bak"),
},
},
},
},
}
3. 条件预测
cmd := &complete.Command{
Flags: complete.Flags{
"--env": complete.PredictSet("dev", "staging", "production"),
},
Sub: complete.Commands{
"deploy": complete.Command{
Flags: complete.Flags{
"--region": complete.PredictFunc(func(prefix string) []string {
// 根据--env的值预测不同的region
env := os.Getenv("COMP_LINE")
if strings.Contains(env, "--env=dev") {
return []string{"us-east-1", "eu-west-1"}
}
return []string{"us-east-1", "eu-west-1", "ap-southeast-2"}
}),
},
},
},
}
部署自动补全
- 生成补全脚本并保存:
go run main.go bash > ~/.myapp-completion.bash
- 在.bashrc中添加:
source ~/.myapp-completion.bash
- 或者安装到系统目录:
sudo go run main.go bash > /etc/bash_completion.d/myapp
内置预测器
complete库提供了多种内置预测器:
PredictFiles(pattern)
- 匹配文件PredictDirs(pattern)
- 匹配目录PredictSet(items...)
- 固定集合PredictNothing
- 不预测PredictAnything
- 任意输入
最佳实践
- 保持补全响应快速(<100ms)
- 为常用命令提供智能补全
- 为文件/目录参数添加适当的过滤器
- 为枚举值提供完整的可能值
- 考虑命令上下文进行条件补全
通过使用complete库,你可以为Go编写的CLI工具添加专业级的Bash自动补全功能,显著提升用户体验。