補完

Spring Shell は、対話型シェルとコマンドラインの両方に補完提案を提供できます。ただし、違いはあります。シェルがインタラクティブモードの場合、シェルのアクティブなインスタンスが存在するため、補完ヒントを提供するためのよりプログラム的な方法を提供する方が簡単です。シェルが純粋にコマンドラインツールとして実行される場合、補完は bash のような OS レベルのシェルに統合することによってのみ達成できます。

対話式

補完のヒントは、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();
}

アノテーションベースのコマンド登録によるオプション値は、@ShellOption アノテーションで定義できる ValueProvider インターフェースを介して処理されます。

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 コマンド補完でドキュメント化されています。