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()
}

如何使用

  1. 首先编写你的Go程序,并集成complete库
  2. 编译程序
  3. 在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"}
				}),
			},
		},
	},
}

部署自动补全

  1. 生成补全脚本并保存:
go run main.go bash > ~/.myapp-completion.bash
  1. 在.bashrc中添加:
source ~/.myapp-completion.bash
  1. 或者安装到系统目录:
sudo go run main.go bash > /etc/bash_completion.d/myapp

内置预测器

complete库提供了多种内置预测器:

  • PredictFiles(pattern) - 匹配文件
  • PredictDirs(pattern) - 匹配目录
  • PredictSet(items...) - 固定集合
  • PredictNothing - 不预测
  • PredictAnything - 任意输入

最佳实践

  1. 保持补全响应快速(<100ms)
  2. 为常用命令提供智能补全
  3. 为文件/目录参数添加适当的过滤器
  4. 为枚举值提供完整的可能值
  5. 考虑命令上下文进行条件补全

通过使用complete库,你可以为Go编写的CLI工具添加专业级的Bash自动补全功能,显著提升用户体验。

回到顶部