# coding: utf-8 # # Copyright © 2010—2014 Andrey Mikhaylenko and contributors # # This file is part of Argh. # # Argh is free software under terms of the GNU Lesser # General Public License version 3 (LGPLv3) as published by the Free # Software Foundation. See the file README.rst for copying conditions. # """ Shell completion ~~~~~~~~~~~~~~~~ Command and argument completion is a great way to reduce the number of keystrokes and improve user experience. To display suggestions when you press :kbd:`tab`, a shell must obtain choices from your program. It calls the program in a specific environment and expects it to return a list of relevant choices. `Argparse` does not support completion out of the box. However, there are 3rd-party apps that do the job, such as argcomplete_ and python-selfcompletion_. `Argh` supports only argcomplete_ which doesn't require subclassing the parser and monkey-patches it instead. Combining `Argh` with python-selfcompletion_ isn't much harder though: simply use `SelfCompletingArgumentParser` instead of vanilla `ArgumentParser`. See installation details and gotchas in the documentation of the 3rd-party app you've chosen for the completion backend. `Argh` automatically enables completion if argcomplete_ is available (see :attr:`COMPLETION_ENABLED`). If completion is undesirable in given app by design, it can be turned off by setting ``completion=False`` in :func:`argh.dispatching.dispatch`. Note that you don't *have* to add completion via `Argh`; it doesn't matter whether you let it do it for you or use the underlying API. .. _argcomplete: https://github.com/kislyuk/argcomplete .. _python-selfcompletion: https://github.com/dbarnett/python-selfcompletion Argument-level completion ------------------------- Argcomplete_ supports custom "completers". The documentation suggests adding the completer as an attribute of the argument parser action:: parser.add_argument("--env-var1").completer = EnvironCompleter However, this doesn't fit the normal `Argh`-assisted workflow. It is recommended to use the :func:`~argh.decorators.arg` decorator:: @arg('--env-var1', completer=EnvironCompleter) def func(...): ... """ import logging import os COMPLETION_ENABLED = False """ Dynamically set to `True` on load if argcomplete_ was successfully imported. """ try: import argcomplete except ImportError: pass else: COMPLETION_ENABLED = True __all__ = ['autocomplete', 'COMPLETION_ENABLED'] logger = logging.getLogger(__package__) def autocomplete(parser): """ Adds support for shell completion via argcomplete_ by patching given `argparse.ArgumentParser` (sub)class. If completion is not enabled, logs a debug-level message. """ if COMPLETION_ENABLED: argcomplete.autocomplete(parser) elif 'bash' in os.getenv('SHELL', ''): logger.debug('Bash completion not available. Install argcomplete.')