完成
Spring Shell 可以为交互式 shell 和命令行提供补全建议。然而,两者之间存在差异,因为当 shell 处于交互模式时,我们有一个活动的 shell 实例,这意味着提供更多程序化的补全提示变得更容易。当 shell 仅作为命令行工具运行时,补全只能通过与操作系统级 shell(如 bash)的集成来实现。
互动
完成提示是通过 function 或 interface 风格的方法计算的,这些方法接受 CompletionContext
并返回一个 CompletionProposal
实例的列表。CompletionContext
提供了关于当前上下文的各种信息,例如命令注册和选项。
备注
通用解析器可以注册为 beans,如果它们对所有命令和场景都很有用。例如,现有的完成实现 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
命令 Completion 中进行了文档说明。