命令补全
Spring Shell 提供了一个强大的命令补全机制,帮助用户发现可用的命令及其选项。命令补全功能可以在使用基于 JLine 的 Shell 时触发,并且在输入命令时按下 Tab 键即可激活。
默认情况下,命令补全会根据当前输入建议可用的命令和选项。但是,你也可以通过实现CompletionProvider接口来自定义自己的命令补全行为。
此接口允许你在基于当前输入的情况下定义如何生成补全建议。
Spring Shell 提供了多种内置补全提供程序,例如:<br>
-
FileNameCompletionProvider: 基于当前目录建议文件和目录名称。 -
EnumCompletionProvider: 从指定的枚举类型中建议值。 -
CompositeCompletionProvider: 将多个完成提供程序合并为一个。
要使用自定义完成提供程序,您需要将其声明为一个 bean 并通过 2 注解的 completionProvider 属性将其设置在您的命令方法上。例如:
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设置完成提供程序。