Completion

Spring Shell 可以為互動式 shell 和命令列提供完成建議。然而,兩者之間存在差異,因為當 shell 處於互動模式時,我們有一個 shell 的活動實例,這表示可以更輕鬆地提供更多程式化的方式來提供完成提示。當 shell 純粹作為命令列工具執行時,完成只能透過整合到作業系統層級的 shell(如 bash)來達成。

互動式

完成提示是透過 函數介面 樣式的方法計算得出,這些方法接受 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 中。