47
47
from . import constants
48
48
from . import plugin
49
49
from . import utils
50
- from .argparse_custom import CompletionError , CompletionItem , DEFAULT_ARGUMENT_PARSER
50
+ from .argparse_custom import CompletionItem , DEFAULT_ARGUMENT_PARSER
51
51
from .clipboard import can_clip , get_paste_buffer , write_to_paste_buffer
52
52
from .decorators import with_argparser
53
53
from .history import History , HistoryItem
54
54
from .parsing import StatementParser , Statement , Macro , MacroArg , shlex_split
55
55
from .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
57
57
58
58
# Set up readline
59
59
if rl_type == RlType .NONE : # pragma: no cover
@@ -1416,17 +1416,27 @@ def complete(self, text: str, state: int) -> Optional[str]:
1416
1416
except IndexError :
1417
1417
return None
1418
1418
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
1419
1428
except Exception as e :
1420
1429
# Insert a newline so the exception doesn't print in the middle of the command line being tab completed
1421
1430
self .perror ()
1422
1431
self .pexcept (e )
1432
+ rl_force_redisplay ()
1423
1433
return None
1424
1434
1425
1435
def _autocomplete_default (self , text : str , line : str , begidx : int , endidx : int , * ,
1426
1436
argparser : argparse .ArgumentParser , preserve_quotes : bool ) -> List [str ]:
1427
1437
"""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 )
1430
1440
tokens , raw_tokens = self .tokens_for_completion (line , begidx , endidx )
1431
1441
1432
1442
# 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
2560
2570
if func is None or argparser is None :
2561
2571
return []
2562
2572
2563
- # Combine the command and its subcommand tokens for the AutoCompleter
2573
+ # Combine the command and its subcommand tokens for the ArgparseCompleter
2564
2574
tokens = [command ] + arg_tokens ['subcommands' ]
2565
2575
2566
- from .argparse_completer import AutoCompleter
2567
- completer = AutoCompleter (argparser , self )
2576
+ from .argparse_completer import ArgparseCompleter
2577
+ completer = ArgparseCompleter (argparser , self )
2568
2578
return completer .complete_subcommand_help (tokens , text , line , begidx , endidx )
2569
2579
2570
2580
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
2576
2586
help_parser .add_argument ('-v' , '--verbose' , action = 'store_true' ,
2577
2587
help = "print a list of all commands with descriptions of each" )
2578
2588
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
2580
2590
if getattr (cmd .Cmd , 'complete_help' , None ) is not None :
2581
2591
delattr (cmd .Cmd , 'complete_help' )
2582
2592
@@ -2594,8 +2604,8 @@ def do_help(self, args: argparse.Namespace) -> None:
2594
2604
2595
2605
# If the command function uses argparse, then use argparse's help
2596
2606
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 )
2599
2609
tokens = [args .command ] + args .subcommands
2600
2610
2601
2611
# 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,
2838
2848
completer_function = settable .completer_function ,
2839
2849
completer_method = settable .completer_method )
2840
2850
2841
- from .argparse_completer import AutoCompleter
2842
- completer = AutoCompleter (settable_parser , self )
2851
+ from .argparse_completer import ArgparseCompleter
2852
+ completer = ArgparseCompleter (settable_parser , self )
2843
2853
2844
2854
# Use raw_tokens since quotes have been preserved
2845
2855
_ , 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,
2860
2870
set_parser = DEFAULT_ARGUMENT_PARSER (parents = [set_parser_parent ])
2861
2871
2862
2872
# 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.
2864
2874
set_parser .add_argument ('value' , nargs = argparse .OPTIONAL , help = 'new value for settable' ,
2865
2875
completer_method = complete_set_value , suppress_tab_hint = True )
2866
2876
0 commit comments