From: Ronan Pigott <rpigott@xxxxxxxxxxxx> This adds a new long form option --zsh-complete to provide all available commands in an output format suitable for parsing by zsh or other shell completion scripts. Invoke like: `bluetoothctl --zsh-complete help` There is no corresponding short form option. --- src/shared/shell.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/shared/shell.c b/src/shared/shell.c index eac654f40..bbf9f9e7a 100644 --- a/src/shared/shell.c +++ b/src/shared/shell.c @@ -79,6 +79,7 @@ static struct { int argc; char **argv; bool mode; + bool zsh; bool monitor; int timeout; struct io *input; @@ -98,6 +99,7 @@ static struct { } data; static void shell_print_menu(void); +static void shell_print_menu_zsh_complete(void); static void cmd_version(int argc, char *argv[]) { @@ -288,6 +290,11 @@ static void shell_print_menu(void) if (!data.menu) return; + if (data.zsh) { + shell_print_menu_zsh_complete(); + return; + } + print_text(COLOR_HIGHLIGHT, "Menu %s:", data.menu->name); print_text(COLOR_HIGHLIGHT, "Available commands:"); print_text(COLOR_HIGHLIGHT, "-------------------"); @@ -314,6 +321,22 @@ static void shell_print_menu(void) } } +static void shell_print_menu_zsh_complete(void) +{ + const struct bt_shell_menu_entry *entry; + + for (entry = data.menu->entries; entry->cmd; entry++) { + printf("%s:%s\n", entry->cmd, entry->desc ? : ""); + } + + for (entry = default_menu; entry->cmd; entry++) { + if (entry->exists && !entry->exists(data.menu)) + continue; + + printf("%s:%s\n", entry->cmd, entry->desc ? : ""); + } +} + static int parse_args(char *arg, wordexp_t *w, char *del, int flags) { char *str; @@ -1015,6 +1038,7 @@ static const struct option main_options[] = { { "help", no_argument, 0, 'h' }, { "timeout", required_argument, 0, 't' }, { "monitor", no_argument, 0, 'm' }, + { "zsh-complete", no_argument, 0, 'z' }, }; static void usage(int argc, char **argv, const struct bt_shell_opt *opt) @@ -1075,6 +1099,9 @@ void bt_shell_init(int argc, char **argv, const struct bt_shell_opt *opt) case 't': data.timeout = atoi(optarg); break; + case 'z': + data.zsh = 1; + break; case 'm': data.monitor = true; if (bt_log_open() < 0) { -- 2.22.1