跳到主要内容

完成

ChatGPT-4o-mini 中英对照 Completion

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

互动

完成提示是通过 functioninterface 风格的方法计算的,这些方法接受 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());
}
}
java

可以为每个选项定义基于构建器的命令注册的选项值。

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

带注解的命令注册的选项值通过 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());
}
}
java

实际的 ValueProvider 需要作为一个 Bean 注册,并且基于注解的命令。

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

命令行

命令行补全目前仅支持 bash,并在内置的 completion 命令 Completion 中进行了文档说明。