コマンドの補完

Spring Shell は、ユーザーが利用可能なコマンドとそのオプションを見つけるのに役立つ強力なコマンド補完メカニズムを提供します。コマンド補完は JLine ベースのシェルで利用可能で、コマンド入力中に Tab キーを押すことで起動できます。

デフォルトでは、コマンド補完は現在の入力に基づいて利用可能なコマンドとオプションを提案します。ただし、CompletionProvider インターフェースを実装することで、独自のコマンドの補完動作をカスタマイズすることもできます。このインターフェースを使用すると、現在の入力に基づいて補完候補を生成する方法を定義できます。

Spring Shell には、次のようないくつかの組み込み補完プロバイダーが用意されています。

  • FileNameCompletionProvider: 現在のディレクトリに基づいてファイル名とディレクトリ名を提案します。

  • EnumCompletionProvider: 指定された列挙型から値を提案します。

  • CompositeCompletionProvider: 複数の補完プロバイダーを 1 つに結合します。

カスタム補完プロバイダを使用するには、Bean として宣言し、@Command アノテーションの 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.completionProvider API を使用してコマンドに補完プロバイダーを設定できます。