diff options
author | Todd Leonhardt <todd.leonhardt@gmail.com> | 2018-05-23 16:23:48 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-23 16:23:48 -0400 |
commit | 5d64ebee348aeffb02fc385f903c9af431e3721b (patch) | |
tree | 5802d2d54efba2402a8b13d73c14b6be975ba91b | |
parent | c2594ff278ac50556cf4781910439ea1977a5873 (diff) | |
parent | 3d953628f1dbf7119001fa0751086b3b6016f764 (diff) | |
download | cmd2-git-5d64ebee348aeffb02fc385f903c9af431e3721b.tar.gz |
Merge pull request #411 from python-cmd2/autocompleter
Fixes problem with not passing the parameter hint suppression down to…
-rw-r--r-- | cmd2/argcomplete_bridge.py | 14 | ||||
-rwxr-xr-x | cmd2/argparse_completer.py | 13 | ||||
-rwxr-xr-x | examples/subcommands.py | 4 |
3 files changed, 30 insertions, 1 deletions
diff --git a/cmd2/argcomplete_bridge.py b/cmd2/argcomplete_bridge.py index 0ac68f1c..824710b0 100644 --- a/cmd2/argcomplete_bridge.py +++ b/cmd2/argcomplete_bridge.py @@ -16,6 +16,7 @@ else: except AttributeError: DEFAULT_COMPLETER = argcomplete.completers.FilesCompleter() + from cmd2.argparse_completer import ACTION_ARG_CHOICES, ACTION_SUPPRESS_HINT from contextlib import redirect_stdout import copy from io import StringIO @@ -245,7 +246,10 @@ else: if comp_type == 63: # type is 63 for second tab press print(outstr.rstrip(), file=argcomplete.debug_stream, end='') - output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding)) + if completions is not None: + output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding)) + else: + output_stream.write(ifs.join([]).encode(argcomplete.sys_encoding)) else: # if completions is None we assume we don't know how to handle it so let bash # go forward with normal filesystem completion @@ -253,3 +257,11 @@ else: output_stream.flush() argcomplete.debug_stream.flush() exit_method(0) + + + def bash_complete(action, show_hint: bool=True): + """Helper function to configure an argparse action to fall back to bash completion""" + def complete_none(*args, **kwargs): + return None + setattr(action, ACTION_SUPPRESS_HINT, not show_hint) + setattr(action, ACTION_ARG_CHOICES, (complete_none,)) diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py index 1995b8d5..d98a6eac 100755 --- a/cmd2/argparse_completer.py +++ b/cmd2/argparse_completer.py @@ -75,6 +75,7 @@ from .rl_utils import rl_force_redisplay # attribute that can optionally added to an argparse argument (called an Action) to # define the completion choices for the argument. You may provide a Collection or a Function. ACTION_ARG_CHOICES = 'arg_choices' +ACTION_SUPPRESS_HINT = 'suppress_hint' class _RangeAction(object): @@ -261,6 +262,7 @@ class AutoCompleter(object): sub_completers[subcmd] = AutoCompleter(action.choices[subcmd], subcmd_start, arg_choices=subcmd_args, subcmd_args_lookup=subcmd_lookup, + tab_for_arg_help=tab_for_arg_help, cmd2_app=cmd2_app) sub_commands.append(subcmd) self._positional_completers[action.dest] = sub_completers @@ -555,8 +557,19 @@ class AutoCompleter(object): return [] def _print_action_help(self, action: argparse.Action) -> None: + # is parameter hinting disabled globally? if not self._tab_for_arg_help: return + + # is parameter hinting disabled for this parameter? + try: + suppress_hint = getattr(action, ACTION_SUPPRESS_HINT) + except AttributeError: + pass + else: + if suppress_hint: + return + if action.option_strings: flags = ', '.join(action.option_strings) param = '' diff --git a/examples/subcommands.py b/examples/subcommands.py index 3dd2c683..55be7711 100755 --- a/examples/subcommands.py +++ b/examples/subcommands.py @@ -19,6 +19,10 @@ base_subparsers = base_parser.add_subparsers(title='subcommands', help='subcomma parser_foo = base_subparsers.add_parser('foo', help='foo help') parser_foo.add_argument('-x', type=int, default=1, help='integer') parser_foo.add_argument('y', type=float, help='float') +input_file = parser_foo.add_argument('input_file', type=str, help='Input File') +if __name__ == '__main__': + from cmd2.argcomplete_bridge import bash_complete + bash_complete(input_file) # create the parser for the "bar" subcommand parser_bar = base_subparsers.add_parser('bar', help='bar help') |