完成

Spring Shell 可以为交互式 Shell 和命令行提供补全建议。然而,它们之间存在差异,因为当 Shell 处于交互模式时,我们拥有一个活跃的 Shell 实例,这意味着更容易提供更多程序化的方式来提供补全提示。当 Shell 纯粹作为命令行工具运行时,补全只能通过与操作系统级别的 Shell(如 bash)集成来完成。

交互式

补全提示通过接受 CompletionContext 并返回 CompletionProposal 实例列表的“函数”或“接口”样式方法计算。CompletionContext 为您提供有关当前上下文的各种信息,例如命令注册和选项。

如果通用解析器对所有命令和场景都很有用,则可以将其注册为 Bean。例如,现有的补全实现 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());
	}
}

使用基于构建器的命令注册的选项值可以按选项定义。

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

使用基于注解的命令注册的选项值通过 ValueProvider 接口处理,该接口可以使用 @ShellOption 注解定义。

static class MyValuesProvider implements ValueProvider {

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

带有注解命令的实际 ValueProvider 需要注册为 Bean

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

命令行

命令行补全目前只支持 bash,并在内置的 completion 命令 补全 中有文档说明。

© . This site is unofficial and not affiliated with VMware.