Add max-completions parameter, and implement tab-completion limiting.
This commit adds a new exception, MAX_COMPLETIONS_REACHED_ERROR, to be thrown whenever the completer has generated too many candidates to be useful. A new user-settable variable, "max_completions", is added to control this behaviour. A top-level completion limit is added to complete_line_internal, as the final check to ensure the user never sees too many completions. An additional limit is added to default_make_symbol_completion_list_break_on, to halt time-consuming symbol table expansions. gdb/ChangeLog: PR cli/9007 PR cli/11920 PR cli/15548 * cli/cli-cmds.c (complete_command): Notify user if max-completions reached. * common/common-exceptions.h (enum errors) <MAX_COMPLETIONS_REACHED_ERROR>: New value. * completer.h (get_max_completions_reached_message): New declaration. (max_completions): Likewise. (completion_tracker_t): New typedef. (new_completion_tracker): New declaration. (make_cleanup_free_completion_tracker): Likewise. (maybe_add_completion_enum): New enum. (maybe_add_completion): New declaration. (throw_max_completions_reached_error): Likewise. * completer.c (max_completions): New global variable. (new_completion_tracker): New function. (free_completion_tracker): Likewise. (make_cleanup_free_completion_tracker): Likewise. (maybe_add_completions): Likewise. (throw_max_completions_reached_error): Likewise. (complete_line): Remove duplicates and limit result to max_completions entries. (get_max_completions_reached_message): New function. (gdb_display_match_list): Handle max_completions. (_initialize_completer): New declaration and function. * symtab.c: Include completer.h. (completion_tracker): New static variable. (completion_list_add_name): Call maybe_add_completion. (default_make_symbol_completion_list_break_on_1): Renamed from default_make_symbol_completion_list_break_on. Maintain completion_tracker across calls to completion_list_add_name. (default_make_symbol_completion_list_break_on): New function. * top.c (init_main): Set rl_completion_display_matches_hook. * tui/tui-io.c: Include completer.h. (tui_old_rl_display_matches_hook): New static global. (tui_rl_display_match_list): Notify user if max-completions reached. (tui_setup_io): Save/restore rl_completion_display_matches_hook. * NEWS (New Options): Mention set/show max-completions. gdb/doc/ChangeLog: * gdb.texinfo (Command Completion): Document new "set/show max-completions" option. gdb/testsuite/ChangeLog: * gdb.base/completion.exp: Disable completion limiting for existing tests. Add new tests to check completion limiting. * gdb.linespec/ls-errs.exp: Disable completion limiting.
This commit is contained in:
parent
e11c72c7e4
commit
ef0b411a11
10 changed files with 478 additions and 24 deletions
|
@ -236,7 +236,8 @@ help_command (char *command, int from_tty)
|
|||
help_cmd (command, gdb_stdout);
|
||||
}
|
||||
|
||||
/* The "complete" command is used by Emacs to implement completion. */
|
||||
/* Note: The "complete" command is used by Emacs to implement completion.
|
||||
[Is that why this function writes output with *_unfiltered?] */
|
||||
|
||||
static void
|
||||
complete_command (char *arg, int from_tty)
|
||||
|
@ -247,6 +248,18 @@ complete_command (char *arg, int from_tty)
|
|||
|
||||
dont_repeat ();
|
||||
|
||||
if (max_completions == 0)
|
||||
{
|
||||
/* Only print this for non-mi frontends. An MI frontend may not
|
||||
be able to handle this. */
|
||||
if (!ui_out_is_mi_like_p (current_uiout))
|
||||
{
|
||||
printf_unfiltered (_("max-completions is zero,"
|
||||
" completion is disabled.\n"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (arg == NULL)
|
||||
arg = "";
|
||||
argpoint = strlen (arg);
|
||||
|
@ -293,6 +306,15 @@ complete_command (char *arg, int from_tty)
|
|||
|
||||
xfree (prev);
|
||||
VEC_free (char_ptr, completions);
|
||||
|
||||
if (size == max_completions)
|
||||
{
|
||||
/* ARG_PREFIX and POINT are included in the output so that emacs
|
||||
will include the message in the output. */
|
||||
printf_unfiltered (_("%s%s %s\n"),
|
||||
arg_prefix, point,
|
||||
get_max_completions_reached_message ());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue