This is what we do for completer callbacks: we let them generate all possible outputs ignoring any partial input (e.g. prefix of a domain name) and then use vshCompleterFilter() to filter out those strings which don't fit the partial input (prefix). The same algorithm is implemented in vshReadlineOptionsGenerator() even though a bit differently. There is no need to have the same code twice. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- tools/vsh.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/tools/vsh.c b/tools/vsh.c index f83b2a95a9..5f082f1a35 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2607,12 +2607,11 @@ vshReadlineCommandGenerator(const char *text) } static char ** -vshReadlineOptionsGenerator(const char *text, +vshReadlineOptionsGenerator(const char *text G_GNUC_UNUSED, const vshCmdDef *cmd, vshCmd *last) { size_t list_index = 0; - size_t len = strlen(text); size_t ret_size = 0; g_auto(GStrv) ret = NULL; @@ -2631,16 +2630,6 @@ vshReadlineOptionsGenerator(const char *text, if (cmd->opts[list_index].type == VSH_OT_ALIAS) continue; - if (len > 2) { - /* provide auto-complete only when the text starts with -- */ - if (STRNEQLEN(text, "--", 2)) - return NULL; - if (STRNEQLEN(name, text + 2, len - 2)) - continue; - } else if (STRNEQLEN(text, "--", len)) { - return NULL; - } - while (opt) { if (STREQ(opt->def->name, name) && opt->def->type != VSH_OT_ARGV) { exists = true; @@ -2790,14 +2779,15 @@ vshReadlineParse(const char *text, int state) } } - /* For string list returned by completer we have to do - * filtering based on @text because completer returns all - * possible strings. */ - if (vshCompleterFilter(&completer_list, text) < 0 || - virStringListMerge(&list, &completer_list) < 0) { + if (virStringListMerge(&list, &completer_list) < 0) goto cleanup; - } } + + /* For string list returned by completers we have to do + * filtering based on @text because completers returns all + * possible strings. */ + if (vshCompleterFilter(&list, text) < 0) + goto cleanup; } } -- 2.26.2