Мне удалось получить желаемое поведение, переопределив компонент LineReader в org.springframework.shell.jline.JLineShellAutoConfiguration
@Bean
public LineReader lineReader() {
LineReaderBuilder lineReaderBuilder = LineReaderBuilder.builder().terminal(this.terminal()).appName("Spring Shell").completer(this.completer()).history(this.history).highlighter(new Highlighter() {
public AttributedString highlight(LineReader reader, String buffer) {
int l = 0;
String best = null;
Iterator var5 = JLineShellAutoConfiguration.this.shell.listCommands().keySet().iterator();
while(var5.hasNext()) {
String command = (String)var5.next();
if (buffer.startsWith(command) && command.length() > l) {
l = command.length();
best = command;
}
}
if (best != null) {
return (new AttributedStringBuilder(buffer.length())).append(best, AttributedStyle.BOLD).append(buffer.substring(l)).toAttributedString();
} else {
return new AttributedString(buffer, AttributedStyle.DEFAULT.foreground(1));
}
}
}).parser(this.parser());
LineReader lineReader = lineReaderBuilder.build();
lineReader.unsetOpt(Option.INSERT_TAB);
return lineReader;
}
В блоке if (best! = Null) if устанавливает текст, выделенный полужирным шрифтом при подборе команды-кандидата, а блок else устанавливает красный текст.