完成

Spring Shell 可以為互動式 Shell 和命令列提供補全建議。然而,它們之間存在差異,因為當 Shell 處於互動模式時,我們擁有一個活躍的 Shell 例項,這意味著更容易提供更多程式化的方式來提供補全提示。當 Shell 純粹作為命令列工具執行時,補全只能透過與作業系統級別的 Shell(如 bash)整合來完成。

互動式

補全提示透過接受 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();
}

使用基於註解的命令註冊的選項值透過 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 命令 補全 中有文件說明。

© . This site is unofficial and not affiliated with VMware.