diff --git a/ChangeLog b/ChangeLog index 73c88a27b..a230190d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-08-28 Marco Gerards + + * include/grub/normal.h (enum grub_completion_type): Added + `GRUB_COMPLETION_TYPE_ARGUMENT'. + + * normal/cmdline.c (print_completion): Handle + the `GRUB_COMPLETION_TYPE_ARGUMENT' type. + * normal/menu_entry.c (store_completion): Likewise. + + * normal/completion.c (complete_arguments): New function. + (grub_normal_do_completion): Call `complete_arguments' when the + current words start with a dash. + 2005-08-27 Marco Gerards * conf/powerpc-ieee1275.rmk (pkgdata_MODULES): Fix typo (use diff --git a/include/grub/normal.h b/include/grub/normal.h index 5e0a2a9b3..89d0d74ac 100644 --- a/include/grub/normal.h +++ b/include/grub/normal.h @@ -51,6 +51,7 @@ enum grub_completion_type GRUB_COMPLETION_TYPE_DEVICE, GRUB_COMPLETION_TYPE_PARTITION, GRUB_COMPLETION_TYPE_FILE, + GRUB_COMPLETION_TYPE_ARGUMENT }; typedef enum grub_completion_type grub_completion_type_t; diff --git a/normal/cmdline.c b/normal/cmdline.c index 844864147..5403fa6cd 100644 --- a/normal/cmdline.c +++ b/normal/cmdline.c @@ -187,6 +187,9 @@ print_completion (const char *item, grub_completion_type_t type, int count) case GRUB_COMPLETION_TYPE_PARTITION: what = "partitions"; break; + case GRUB_COMPLETION_TYPE_ARGUMENT: + what = "arguments"; + break; default: what = "things"; break; diff --git a/normal/completion.c b/normal/completion.c index 7e4e77d2c..b587a36ac 100644 --- a/normal/completion.c +++ b/normal/completion.c @@ -303,6 +303,61 @@ complete_file (void) return ret; } +/* Complete an argument. */ +static int +complete_arguments (char *command) +{ + grub_command_t cmd; + struct grub_arg_option *option; + char shortarg[] = "- "; + + cmd = grub_command_find (command); + + if (!cmd || !cmd->options) + return 0; + + if (add_completion ("-u", " ", GRUB_COMPLETION_TYPE_ARGUMENT)) + return 1; + + /* Add the short arguments. */ + for (option = cmd->options; option->doc; option++) + { + if (!option->shortarg) + continue; + + shortarg[1] = option->shortarg; + if (add_completion (shortarg, " ", GRUB_COMPLETION_TYPE_ARGUMENT)) + return 1; + + } + + /* First add the built-in arguments. */ + if (add_completion ("--help", " ", GRUB_COMPLETION_TYPE_ARGUMENT)) + return 1; + if (add_completion ("--usage", " ", GRUB_COMPLETION_TYPE_ARGUMENT)) + return 1; + + /* Add the long arguments. */ + for (option = cmd->options; option->doc; option++) + { + char *longarg; + if (!option->longarg) + continue; + + longarg = grub_malloc (grub_strlen (option->longarg)); + grub_sprintf (longarg, "--%s", option->longarg); + + if (add_completion (longarg, " ", GRUB_COMPLETION_TYPE_ARGUMENT)) + { + grub_free (longarg); + return 1; + } + grub_free (longarg); + } + + return 0; +} + /* Try to complete the string in BUF. Return the characters that should be added to the string. This command outputs the possible completions by calling HOOK, in that case set RESTORE to 1 so the @@ -342,7 +397,12 @@ grub_normal_do_completion (char *buf, int *restore, { current_word++; - if (*current_word == '(' && ! grub_strchr (current_word, ')')) + if (*current_word == '-') + { + if (complete_arguments (buf)) + goto fail; + } + else if (*current_word == '(' && ! grub_strchr (current_word, ')')) { /* Complete a device. */ if (complete_device ()) diff --git a/normal/menu_entry.c b/normal/menu_entry.c index 9cde3d4f0..987756c58 100644 --- a/normal/menu_entry.c +++ b/normal/menu_entry.c @@ -840,6 +840,9 @@ store_completion (const char *item, grub_completion_type_t type, int count) case GRUB_COMPLETION_TYPE_PARTITION: what = "partitions"; break; + case GRUB_COMPLETION_TYPE_ARGUMENT: + what = "arguments"; + break; default: what = "things"; break;