命令补全

Spring Shell 提供了一个强大的命令补全机制,帮助用户发现可用的命令及其选项。命令补全功能可以在使用基于 JLine 的 Shell 时触发,并且在输入命令时按下 Tab 键即可激活。spring-doc.cadn.net.cn

默认情况下,命令补全会根据当前输入建议可用的命令和选项。但是,你也可以通过实现CompletionProvider接口来自定义自己的命令补全行为。 此接口允许你在基于当前输入的情况下定义如何生成补全建议。spring-doc.cadn.net.cn

Spring Shell 提供了多种内置补全提供程序,例如:<br>spring-doc.cadn.net.cn

要使用自定义完成提供程序,您需要将其声明为一个 bean 并通过 2 注解的 completionProvider 属性将其设置在您的命令方法上。例如:
spring-doc.cadn.net.cn

public enum Gender {
	MALE, FEMALE
}

@Command(name = "hello", description = "Say hello to a given name", group = "Greetings",
		help = "A command that greets the user with 'Hello [Mr.|Ms.] ${name}!'. Usage: hello [-n | --name]=<name> [-g | --gender]=<gender>",
		completionProvider = "helloCompletionProvider")
public void sayHello(
		@Option(shortName = 'n', longName = "name", description = "the name of the person to greet", defaultValue = "World") String name,
		@Option(shortName = 'g', longName = "gender", description = "the gender of the person to greet") Gender gender) {
	String prefix = switch (gender) {
		case MALE -> "Mr. ";
		case FEMALE -> "Ms. ";
	};
	System.out.println("Hello " + prefix + name + "!");
}

@Bean
public CompletionProvider helloCompletionProvider() {
	EnumCompletionProvider genderCompletionProvider = new EnumCompletionProvider(Gender.class, "--gender");
	CompletionProvider nameCompletionProvider = completionContext -> List.of(new CompletionProposal("--name=Bob"), new CompletionProposal("--name=Alice"));
	return new CompositeCompletionProvider(nameCompletionProvider, genderCompletionProvider);
}

使用编程方法,您可以在命令中通过Command.Builder.completionProviderAPI设置完成提供程序。spring-doc.cadn.net.cn