diff --git a/spring-shell2-core/src/main/java/org/springframework/shell2/CompletionProposal.java b/spring-shell2-core/src/main/java/org/springframework/shell2/CompletionProposal.java index d1ef5c04..141622d1 100644 --- a/spring-shell2-core/src/main/java/org/springframework/shell2/CompletionProposal.java +++ b/spring-shell2-core/src/main/java/org/springframework/shell2/CompletionProposal.java @@ -43,6 +43,12 @@ public class CompletionProposal { */ private String category; + /** + * Whether the proposal should bypass escaping and quoting rules. This is useful for command proposals, which can + * appear as true multi-word Strings. + */ + private boolean dontQuote = false; + public CompletionProposal(String value) { this.value = this.displayText = value; } @@ -83,6 +89,15 @@ public class CompletionProposal { return this; } + public CompletionProposal dontQuote(boolean dontQuote) { + this.dontQuote = dontQuote; + return this; + } + + public boolean dontQuote() { + return dontQuote; + } + @Override public String toString() { return value; diff --git a/spring-shell2-core/src/main/java/org/springframework/shell2/Shell.java b/spring-shell2-core/src/main/java/org/springframework/shell2/Shell.java index a4c24876..05991393 100644 --- a/spring-shell2-core/src/main/java/org/springframework/shell2/Shell.java +++ b/spring-shell2-core/src/main/java/org/springframework/shell2/Shell.java @@ -172,6 +172,7 @@ public class Shell implements CommandRegistry { private CompletionProposal toCompletionProposal(String command, MethodTarget methodTarget) { return new CompletionProposal(command) + .dontQuote(true) .category("Available commands") .description(methodTarget.getHelp()); } diff --git a/spring-shell2-core/src/main/java/org/springframework/shell2/jline/JLineShell.java b/spring-shell2-core/src/main/java/org/springframework/shell2/jline/JLineShell.java index 57a0b499..642cf507 100644 --- a/spring-shell2-core/src/main/java/org/springframework/shell2/jline/JLineShell.java +++ b/spring-shell2-core/src/main/java/org/springframework/shell2/jline/JLineShell.java @@ -154,7 +154,7 @@ public class JLineShell { List proposals = shell.complete(context); proposals.stream() .map(p -> new Candidate( - cpl.emit(p.value()).toString(), + p.dontQuote() ? p.value() : cpl.emit(p.value()).toString(), p.displayText(), p.category(), p.description(),