6. 完成

Spring Shell 可以为交互式 shell 提供完成建议 和一个命令行。但是,当 shell 在 交互模式,则有一个 shell 的活动实例,这意味着它是 更容易提供更多编程方式来提供完成提示。 当 shell 纯粹作为命令行工具运行时,补全只能 通过集成到 OS 级 shell 中(如 bash)来实现。spring-doc.cadn.net.cn

6.1. 交互式

补全的提示是使用函数接口样式计算的 方法,它采用CompletionContext并返回CompletionProposal实例。CompletionContext为您提供各种 有关当前上下文的信息,如 Command Registration 和 Option。spring-doc.cadn.net.cn

如果通用解析器有用,则可以将其注册为 bean 对于所有命令和 scenarious。例如,现有补全 实现RegistrationOptionsCompletionResolver处理完成 对于选项名称。
static class MyValuesCompletionResolver implements CompletionResolver {

	@Override
	public List<CompletionProposal> apply(CompletionContext t) {
		return Arrays.asList("val1", "val2").stream()
			.map(CompletionProposal::new)
			.collect(Collectors.toList());
	}
}

具有基于 builder 的命令注册的选项值可以是 按选项定义。spring-doc.cadn.net.cn

void dump1() {
	CommandRegistration.builder()
		.withOption()
			.longNames("arg1")
			.completion(ctx -> {
				return Arrays.asList("val1", "val2").stream()
					.map(CompletionProposal::new)
					.collect(Collectors.toList());
			})
			.and()
		.build();
}

处理具有基于注释的命令注册的选项值 通过ValueProviderinterface,可以使用@ShellOption注解。spring-doc.cadn.net.cn

static class MyValuesProvider implements ValueProvider {

	@Override
	public List<CompletionProposal> complete(CompletionContext completionContext) {
		return Arrays.asList("val1", "val2").stream()
			.map(CompletionProposal::new)
			.collect(Collectors.toList());
	}
}

实际ValueProviderwith annotation based 命令需要为 注册为 Beanspring-doc.cadn.net.cn

@ShellMethod(value = "complete", key = "complete")
public String complete(
	@ShellOption(valueProvider = MyValuesProvider.class) String arg1)
{
	return "You said " + arg1;
}

6.2. 命令行

命令行补全目前仅支持 bash,并且有文档记录 在内置的completion命令完成spring-doc.cadn.net.cn