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 中。