4747from . import constants
4848from . import plugin
4949from . import utils
50- from .argparse_custom import CompletionError, CompletionItem, DEFAULT_ARGUMENT_PARSER
50+ from .argparse_custom import CompletionItem, DEFAULT_ARGUMENT_PARSER
5151from .clipboard import can_clip, get_paste_buffer, write_to_paste_buffer
5252from .decorators import with_argparser
5353from .history import History, HistoryItem
5454from .parsing import StatementParser, Statement, Macro, MacroArg, shlex_split
5555from .rl_utils import rl_type, RlType, rl_get_point, rl_set_prompt, vt100_support, rl_make_safe_prompt, rl_warning
56- from .utils import Settable
56+ from .utils import CompletionError, Settable
5757
5858# Set up readline
5959if rl_type == RlType.NONE: # pragma: no cover
@@ -1416,17 +1416,27 @@ def complete(self, text: str, state: int) -> Optional[str]:
14161416 except IndexError:
14171417 return None
14181418
1419+ except CompletionError as ex:
1420+ # Don't print error and redraw the prompt unless the error has length
1421+ err_str = str(ex)
1422+ if err_str:
1423+ if ex.apply_style:
1424+ err_str = ansi.style_error(err_str)
1425+ ansi.style_aware_write(sys.stdout, '\n' + err_str + '\n')
1426+ rl_force_redisplay()
1427+ return None
14191428 except Exception as e:
14201429 # Insert a newline so the exception doesn't print in the middle of the command line being tab completed
14211430 self.perror()
14221431 self.pexcept(e)
1432+ rl_force_redisplay()
14231433 return None
14241434
14251435 def _autocomplete_default(self, text: str, line: str, begidx: int, endidx: int, *,
14261436 argparser: argparse.ArgumentParser, preserve_quotes: bool) -> List[str]:
14271437 """Default completion function for argparse commands"""
1428- from .argparse_completer import AutoCompleter
1429- completer = AutoCompleter (argparser, self)
1438+ from .argparse_completer import ArgparseCompleter
1439+ completer = ArgparseCompleter (argparser, self)
14301440 tokens, raw_tokens = self.tokens_for_completion(line, begidx, endidx)
14311441
14321442 # To have tab-completion parsing match command line parsing behavior,
@@ -2560,11 +2570,11 @@ def complete_help_subcommands(self, text: str, line: str, begidx: int, endidx: i
25602570 if func is None or argparser is None:
25612571 return []
25622572
2563- # Combine the command and its subcommand tokens for the AutoCompleter
2573+ # Combine the command and its subcommand tokens for the ArgparseCompleter
25642574 tokens = [command] + arg_tokens['subcommands']
25652575
2566- from .argparse_completer import AutoCompleter
2567- completer = AutoCompleter (argparser, self)
2576+ from .argparse_completer import ArgparseCompleter
2577+ completer = ArgparseCompleter (argparser, self)
25682578 return completer.complete_subcommand_help(tokens, text, line, begidx, endidx)
25692579
25702580 help_parser = DEFAULT_ARGUMENT_PARSER(description="List available commands or provide "
@@ -2576,7 +2586,7 @@ def complete_help_subcommands(self, text: str, line: str, begidx: int, endidx: i
25762586 help_parser.add_argument('-v', '--verbose', action='store_true',
25772587 help="print a list of all commands with descriptions of each")
25782588
2579- # Get rid of cmd's complete_help() functions so AutoCompleter will complete the help command
2589+ # Get rid of cmd's complete_help() functions so ArgparseCompleter will complete the help command
25802590 if getattr(cmd.Cmd, 'complete_help', None) is not None:
25812591 delattr(cmd.Cmd, 'complete_help')
25822592
@@ -2594,8 +2604,8 @@ def do_help(self, args: argparse.Namespace) -> None:
25942604
25952605 # If the command function uses argparse, then use argparse's help
25962606 if func is not None and argparser is not None:
2597- from .argparse_completer import AutoCompleter
2598- completer = AutoCompleter (argparser, self)
2607+ from .argparse_completer import ArgparseCompleter
2608+ completer = ArgparseCompleter (argparser, self)
25992609 tokens = [args.command] + args.subcommands
26002610
26012611 # Set end to blank so the help output matches how it looks when "command -h" is used
@@ -2838,8 +2848,8 @@ def complete_set_value(self, text: str, line: str, begidx: int, endidx: int,
28382848 completer_function=settable.completer_function,
28392849 completer_method=settable.completer_method)
28402850
2841- from .argparse_completer import AutoCompleter
2842- completer = AutoCompleter (settable_parser, self)
2851+ from .argparse_completer import ArgparseCompleter
2852+ completer = ArgparseCompleter (settable_parser, self)
28432853
28442854 # Use raw_tokens since quotes have been preserved
28452855 _, raw_tokens = self.tokens_for_completion(line, begidx, endidx)
@@ -2860,7 +2870,7 @@ def complete_set_value(self, text: str, line: str, begidx: int, endidx: int,
28602870 set_parser = DEFAULT_ARGUMENT_PARSER(parents=[set_parser_parent])
28612871
28622872 # Suppress tab-completion hints for this field. The completer method is going to create an
2863- # AutoCompleter based on the actual parameter being completed and we only want that hint printing.
2873+ # ArgparseCompleter based on the actual parameter being completed and we only want that hint printing.
28642874 set_parser.add_argument('value', nargs=argparse.OPTIONAL, help='new value for settable',
28652875 completer_method=complete_set_value, suppress_tab_hint=True)
28662876
0 commit comments