diff --git a/prompt.c b/prompt.c index 300b278d8..39261e27c 100644 --- a/prompt.c +++ b/prompt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: prompt.c,v 1.7 2026/09/09 07:53:03 nicm Exp $ */ +/* $OpenBSD: prompt.c,v 1.8 2026/10/13 07:56:00 nicm Exp $ */ /* * Copyright (c) 2026 Nicholas Marriott @@ -1555,14 +1555,25 @@ prompt_complete_add(char ***list, u_int *size, const char *s) /* Build completion list. */ static char ** -prompt_complete_commands(u_int *size, const char *s) +prompt_complete_commands(u_int *size, const char *s, int at_start) { - char **list = NULL, *tmp; - const char *value, *cp; - const struct cmd_entry **cmdent; - size_t slen = strlen(s), valuelen; - struct options_entry *o; - struct options_array_item *a; + char **list = NULL, *tmp; + const char **layout, *value, *cp; + const struct cmd_entry **cmdent; + const struct options_table_entry *oe; + size_t slen = strlen(s), valuelen; + struct options_entry *o; + struct options_array_item *a; + const char *layouts[] = { + "even-horizontal", + "even-vertical", + "main-horizontal", + "main-horizontal-mirrored", + "main-vertical", + "main-vertical-mirrored", + "tiled", + NULL + }; *size = 0; for (cmdent = cmd_table; *cmdent != NULL; cmdent++) { @@ -1588,6 +1599,16 @@ prompt_complete_commands(u_int *size, const char *s) a = options_array_next(a); } } + if (at_start) + return (list); + for (oe = options_table; oe->name != NULL; oe++) { + if (strncmp(oe->name, s, slen) == 0) + prompt_complete_add(&list, size, oe->name); + } + for (layout = layouts; *layout != NULL; layout++) { + if (strncmp(*layout, s, slen) == 0) + prompt_complete_add(&list, size, *layout); + } return (list); } @@ -1671,11 +1692,10 @@ prompt_complete(struct prompt *pr, const char *word, u_int offset) char **list = NULL, *out = NULL; u_int size = 0, i; - if (pr->type != PROMPT_TYPE_COMMAND || offset != 0 || - *word == '\0') + if (pr->type != PROMPT_TYPE_COMMAND || *word == '\0') return (NULL); - list = prompt_complete_commands(&size, word); + list = prompt_complete_commands(&size, word, offset == 0); if (size == 0) { free(list); return (NULL);