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