diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/cli/cli-cmds.c | 22 | ||||
-rw-r--r-- | gdb/cli/cli-decode.c | 56 | ||||
-rw-r--r-- | gdb/cli/cli-decode.h | 2 |
4 files changed, 69 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d13b44e..8619fd8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be> + * cli/cli-decode.h (apropos_cmd): Add verbose argument. + * cli/cli-decode.c (apropos_cmd): Likewise. Use print_doc_of_command + instead of print_help_for_command. + (print_doc_of_command): New function. + (help_list): Add 'apropos -v word' suggestion. + (print_help_for_command): Style the command name using title style. + * cli/cli-cmds.c (apropos_command): Parse optional -v flag. + (_initialize_cli_cmds): Describe -v in apropos_command help. + +2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be> + * cli/cli-style.h (cli_style_option): Add name in constructor, add m_name class member, add constructor with intensity, add name class function. diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index bb2b04d..09f932c 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1376,16 +1376,21 @@ show_user (const char *args, int from_tty) /* Search through names of commands and documentations for a certain regular expression. */ -static void -apropos_command (const char *searchstr, int from_tty) +static void +apropos_command (const char *arg, int from_tty) { - if (searchstr == NULL) + bool verbose = arg && check_for_argument (&arg, "-v", 2); + + if (verbose) + arg = skip_spaces (arg); + + if (arg == NULL || *arg == '\0') error (_("REGEXP string is empty")); - compiled_regex pattern (searchstr, REG_ICASE, + compiled_regex pattern (arg, REG_ICASE, _("Error in regular expression")); - apropos_cmd (gdb_stdout, cmdlist, pattern, ""); + apropos_cmd (gdb_stdout, cmdlist, verbose, pattern, ""); } /* Subroutine of alias_command to simplify it. @@ -1981,8 +1986,11 @@ Run the ``make'' program using the rest of the line as arguments.")); Show definitions of non-python/scheme user defined commands.\n\ Argument is the name of the user defined command.\n\ With no argument, show definitions of all user defined commands."), &showlist); - add_com ("apropos", class_support, apropos_command, - _("Search for commands matching a REGEXP")); + add_com ("apropos", class_support, apropos_command, _("\ +Search for commands matching a REGEXP\n\ +Usage: apropos [-v] REGEXP\n\ +Flag -v indicates to produce a verbose output, showing full documentation\n\ +of the matching commands.")); add_setshow_uinteger_cmd ("max-user-call-depth", no_class, &max_user_call_depth, _("\ diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index e3076f2..e59e0c7 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -23,6 +23,7 @@ #include "ui-out.h" #include "cli/cli-cmds.h" #include "cli/cli-decode.h" +#include "cli/cli-style.h" #include "common/gdb_optional.h" /* Prototypes for local functions. */ @@ -937,14 +938,42 @@ add_com_suppress_notification (const char *name, enum command_class theclass, &cmdlist, suppress_notification); } +/* If VERBOSE, print the full help for command C and highlight the + documentation parts matching HIGHLIGHT, + otherwise print only one-line help for command C. */ + +static void +print_doc_of_command (struct cmd_list_element *c, const char *prefix, + bool verbose, compiled_regex &highlight, + struct ui_file *stream) +{ + /* When printing the full documentation, add a line to separate + this documentation from the previous command help, in the likely + case that apropos finds several commands. */ + if (verbose) + fputs_filtered ("\n", stream); + + fprintf_styled (stream, title_style.style (), + "%s%s", prefix, c->name); + fputs_filtered (" -- ", stream); + if (verbose) + fputs_highlighted (c->doc, highlight, stream); + else + print_doc_line (stream, c->doc); + fputs_filtered ("\n", stream); +} + /* Recursively walk the commandlist structures, and print out the documentation of commands that match our regex in either their name, or their documentation. + If VERBOSE, prints the complete documentation and highlight the + documentation parts matching REGEX, otherwise prints only + the first line. */ -void -apropos_cmd (struct ui_file *stream, +void +apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist, - compiled_regex ®ex, const char *prefix) + bool verbose, compiled_regex ®ex, const char *prefix) { struct cmd_list_element *c; int returnvalue; @@ -960,10 +989,7 @@ apropos_cmd (struct ui_file *stream, /* Try to match against the name. */ returnvalue = regex.search (c->name, name_len, 0, name_len, NULL); if (returnvalue >= 0) - { - print_help_for_command (c, prefix, - 0 /* don't recurse */, stream); - } + print_doc_of_command (c, prefix, verbose, regex, stream); } if (c->doc != NULL && returnvalue < 0) { @@ -971,10 +997,7 @@ apropos_cmd (struct ui_file *stream, /* Try to match against documentation. */ if (regex.search (c->doc, doc_len, 0, doc_len, NULL) >= 0) - { - print_help_for_command (c, prefix, - 0 /* don't recurse */, stream); - } + print_doc_of_command (c, prefix, verbose, regex, stream); } /* Check if this command has subcommands and is not an abbreviation. We skip listing subcommands of abbreviations @@ -983,7 +1006,7 @@ apropos_cmd (struct ui_file *stream, { /* Recursively call ourselves on the subcommand list, passing the right prefix in. */ - apropos_cmd (stream,*c->prefixlist,regex,c->prefixname); + apropos_cmd (stream, *c->prefixlist, verbose, regex, c->prefixname); } } } @@ -1126,6 +1149,9 @@ Type \"help all\" for the list of all commands."); fputs_filtered ("documentation.\n", stream); fputs_filtered ("Type \"apropos word\" to search " "for commands related to \"word\".\n", stream); + fputs_filtered ("Type \"apropos -v word\" for full documentation", stream); + wrap_here (""); + fputs_filtered (" of commands related to \"word\".\n", stream); fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n", stream); } @@ -1212,10 +1238,12 @@ static void print_help_for_command (struct cmd_list_element *c, const char *prefix, int recurse, struct ui_file *stream) { - fprintf_filtered (stream, "%s%s -- ", prefix, c->name); + fprintf_styled (stream, title_style.style (), + "%s%s", prefix, c->name); + fputs_filtered (" -- ", stream); print_doc_line (stream, c->doc); fputs_filtered ("\n", stream); - + if (recurse && c->prefixlist != 0 && c->abbrev_flag == 0) diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h index c53683d..a9f9cbf 100644 --- a/gdb/cli/cli-decode.h +++ b/gdb/cli/cli-decode.h @@ -249,7 +249,7 @@ extern void help_cmd_list (struct cmd_list_element *, enum command_class, extern void help_cmd (const char *, struct ui_file *); extern void apropos_cmd (struct ui_file *, struct cmd_list_element *, - compiled_regex &, const char *); + bool verbose, compiled_regex &, const char *); /* Used to mark commands that don't do anything. If we just leave the function field NULL, the command is interpreted as a help topic, or |