golang多shell多命令参数自动补全插件carapace-bin的使用

golang多shell多命令参数自动补全插件carapace-bin的使用

简介

carapace-bin 是一个为多种 CLI 命令提供参数自动补全功能的 Golang 工具,支持多种 POSIX 和非 POSIX shell。

示例图片

支持的Shell

  • Bash
  • Cmd (实验性)
  • Elvish
  • Fish
  • Ion (实验性)
  • Nushell
  • Oil
  • Powershell
  • Tcsh (实验性)
  • Xonsh
  • Zsh

快速开始

安装

可以通过以下方式安装 carapace-bin:

# 使用go install安装
go install github.com/carapace-sh/carapace-bin/cmd/carapace@latest

# 或者使用brew安装
brew install carapace

基本使用示例

下面是一个简单的示例,展示如何为自定义命令添加自动补全功能:

package main

import (
	"github.com/carapace-sh/carapace-bin/pkg/actions"
	"github.com/carapace-sh/carapace-bin/pkg/actions/os"
	"github.com/carapace-sh/carapace-bin/pkg/carapace"
	"github.com/spf13/cobra"
)

func main() {
	var rootCmd = &cobra.Command{
		Use:   "mycmd",
		Short: "A demo command with carapace completion",
	}

	// 添加子命令
	var subCmd = &cobra.Command{
		Use:   "sub",
		Short: "A subcommand",
		Run: func(cmd *cobra.Command, args []string) {
			// 命令逻辑
		},
	}

	// 添加带补全的flag
	subCmd.Flags().StringP("file", "f", "", "specify a file")
	carapace.Gen(subCmd).FlagCompletion(carapace.ActionMap{
		"file": carapace.ActionFiles(), // 文件自动补全
	})

	// 添加带补全的位置参数
	subCmd.Flags().StringP("user", "u", "", "specify a user")
	carapace.Gen(subCmd).FlagCompletion(carapace.ActionMap{
		"user": os.ActionUsers(), // 用户自动补全
	})

	rootCmd.AddCommand(subCmd)

	// 执行命令
	carapace.Gen(rootCmd).Root().Execute()
}

为现有命令添加补全

carapace-bin 已经为许多常用命令提供了内置补全支持。要为这些命令启用补全,只需运行:

# 为git命令启用补全
carapace --setup git

# 为docker命令启用补全
carapace --setup docker

自定义补全示例

下面是一个更复杂的自定义补全示例:

package main

import (
	"github.com/carapace-sh/carapace-bin/pkg/actions"
	"github.com/carapace-sh/carapace-bin/pkg/carapace"
	"github.com/spf13/cobra"
)

func main() {
	var rootCmd = &cobra.Command{
		Use:   "complex",
		Short: "A command with complex completion",
	}

	var subCmd = &cobra.Command{
		Use:   "action",
		Short: "Perform an action",
		Args:  cobra.MinimumNArgs(1),
		Run: func(cmd *cobra.Command, args []string) {
			// 命令逻辑
		},
	}

	// 自定义补全函数
	carapace.Gen(subCmd).PositionalCompletion(
		carapace.ActionCallback(func(c carapace.Context) carapace.Action {
			// 根据上下文动态生成补全选项
			return carapace.ActionValuesDescribed(
				"start", "Start the service",
				"stop", "Stop the service",
				"restart", "Restart the service",
				"status", "Show service status",
			)
		}),
	)

	// 带条件的补全
	subCmd.Flags().StringP("type", "t", "", "specify type")
	carapace.Gen(subCmd).FlagCompletion(carapace.ActionMap{
		"type": carapace.ActionValues("dev", "prod", "test"),
	})

	// 根据flag值改变位置参数的补全
	carapace.Gen(subCmd).PositionalAnyCompletion(
		carapace.ActionCallback(func(c carapace.Context) carapace.Action {
			if typeFlag := subCmd.Flag("type").Value.String(); typeFlag != "" {
				switch typeFlag {
				case "dev":
					return carapace.ActionValues("debug", "log", "trace")
				case "prod":
					return carapace.ActionValues("deploy", "rollback", "scale")
				case "test":
					return carapace.ActionValues("unit", "integration", "e2e")
				}
			}
			return carapace.ActionValues()
		}),
	)

	rootCmd.AddCommand(subCmd)
	carapace.Gen(rootCmd).Root().Execute()
}

高级功能

carapace-bin 还支持更高级的功能,如:

  • 多级补全
  • 依赖补全
  • 动态补全
  • 条件补全

可以通过官方文档了解更多高级用法。


更多关于golang多shell多命令参数自动补全插件carapace-bin的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang多shell多命令参数自动补全插件carapace-bin的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 carapace-bin 实现 Golang 多命令参数自动补全

carapace-bin 是一个强大的命令行参数自动补全工具,专为 Golang 程序设计,支持多种 shell(包括 bash、zsh、fish 和 powershell)。下面我将详细介绍如何使用它。

安装 carapace-bin

首先安装 carapace-bin:

go install github.com/rsteube/carapace-bin/cmd/carapace@latest

基本使用示例

1. 为你的 CLI 程序添加补全支持

假设你有一个 Golang CLI 程序,下面是如何为其添加补全支持:

package main

import (
	"github.com/rsteube/carapace"
	"github.com/rsteube/carapace-bin/pkg/actions/tools/git"
	"github.com/spf13/cobra"
)

func main() {
	var rootCmd = &cobra.Command{
		Use:   "mycli",
		Short: "A demo CLI with autocompletion",
	}

	var cloneCmd = &cobra.Command{
		Use:   "clone",
		Short: "Clone a repository",
		Run: func(cmd *cobra.Command, args []string) {
			// 实际命令逻辑
		},
	}

	// 为 clone 命令添加自动补全
	carapace.Gen(cloneCmd).PositionalCompletion(
		git.ActionRepositorySearch(git.SearchOpts{}.Default()),
	)

	rootCmd.AddCommand(cloneCmd)
	rootCmd.Execute()
}

2. 生成补全脚本

为你的 shell 生成补全脚本:

# 为 bash 生成
carapace --bash your-cli-program > ~/.bash_completion.d/your-cli-program

# 为 zsh 生成
carapace --zsh your-cli-program > ~/.zsh/completion/_your-cli-program

然后在你的 shell 配置文件中加载它。

高级功能

1. 多级命令补全

var subCmd = &cobra.Command{
	Use:   "sub",
	Short: "Subcommand",
}

var subSubCmd = &cobra.Command{
	Use:   "subsub",
	Short: "Sub-subcommand",
}

carapace.Gen(subSubCmd).PositionalCompletion(
	carapace.ActionValues("value1", "value2", "value3"),
)

subCmd.AddCommand(subSubCmd)
rootCmd.AddCommand(subCmd)

2. 带标志的补全

var listCmd = &cobra.Command{
	Use:   "list",
	Short: "List items",
}

listCmd.Flags().StringP("filter", "f", "", "Filter items")
carapace.Gen(listCmd).FlagCompletion(carapace.ActionMap{
	"filter": carapace.ActionValues("all", "active", "inactive"),
})

3. 动态补全

carapace.Gen(rootCmd).PositionalCompletion(
	carapace.ActionCallback(func(c carapace.Context) carapace.Action {
		// 这里可以添加动态生成补全选项的逻辑
		return carapace.ActionValues("dynamic1", "dynamic2")
	}),
)

集成现有补全

carapace-bin 已经为许多常见工具(如 git、docker、kubectl 等)内置了补全规则:

carapace.Gen(rootCmd).PositionalCompletion(
	docker.ActionRepositories(),
)

测试补全

安装后,你可以这样测试:

# 在 bash 中
source ~/.bash_completion.d/your-cli-program
your-cli-program <TAB>

# 在 zsh 中
autoload -U compinit && compinit
your-cli-program <TAB>

最佳实践

  1. 为所有命令和子命令添加补全
  2. 为所有标志添加补全
  3. 使用有意义的补全值
  4. 考虑使用动态补全获取最新数据
  5. 为你的用户提供清晰的安装说明

carapace-bin 的强大之处在于它可以为复杂的 CLI 应用程序提供智能的、上下文感知的补全,大大提升了用户体验。

回到顶部