From 8bb95560d0038f4663db90e032f39f745f476bc6 Mon Sep 17 00:00:00 2001 From: Sergey A Volkov Date: Thu, 8 Aug 2019 16:04:05 +0300 Subject: [PATCH] Help string support for fish --- README.rst | 10 ++++++++++ argcomplete/__init__.py | 15 +++++++++++++-- argcomplete/shell_integration.py | 1 + docs/fish_help_string.png | Bin 0 -> 14171 bytes test/prog | 4 ++-- test/test.py | 30 ++++++++++++++++++++++++++++-- 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 docs/fish_help_string.png diff --git a/README.rst b/README.rst index a6eb8a7f..365a6216 100644 --- a/README.rst +++ b/README.rst @@ -282,6 +282,16 @@ or create new completion file, e.g:: register-python-argcomplete --shell fish ~/.config/fish/completions/my-awesome-script.fish +Completion Description For Fish +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +By default help string is added as completion description. + +.. image:: docs/fish_help_string.png + +You can disable this feature by removing ``_ARGCOMPLETE_DFS`` variable, e.g:: + + register-python-argcomplete --shell fish my-awesome-script | grep -v _ARGCOMPLETE_DFS | . + Python Support -------------- Argcomplete requires Python 2.7 or 3.5+. diff --git a/argcomplete/__init__.py b/argcomplete/__init__.py index 6cc524e6..a4e0dd4e 100644 --- a/argcomplete/__init__.py +++ b/argcomplete/__init__.py @@ -199,6 +199,11 @@ def __call__(self, argument_parser, always_complete_options=True, exit_method=os debug("Invalid value for IFS, quitting [{v}]".format(v=ifs)) exit_method(1) + dfs = os.environ.get("_ARGCOMPLETE_DFS") + if dfs and len(dfs) != 1: + debug("Invalid value for DFS, quitting [{v}]".format(v=dfs)) + exit_method(1) + comp_line = os.environ["COMP_LINE"] comp_point = int(os.environ["COMP_POINT"]) @@ -226,6 +231,12 @@ def __call__(self, argument_parser, always_complete_options=True, exit_method=os completions = self._get_completions(comp_words, cword_prefix, cword_prequote, last_wordbreak_pos) + if dfs: + display_completions = {key_part: value.replace(ifs, " ") if value else "" + for key, value in self._display_completions.items() + for key_part in key} + completions = [dfs.join((key, display_completions.get(key) or "")) for key in completions] + debug("\nReturning completions:", completions) output_stream.write(ifs.join(completions).encode(sys_encoding)) output_stream.flush() @@ -350,7 +361,7 @@ def _include_options(self, action, cword_prefix): def _get_option_completions(self, parser, cword_prefix): self._display_completions.update( - [[" ".join(ensure_str(x) for x in action.option_strings + [[tuple(ensure_str(x) for x in action.option_strings if ensure_str(x).startswith(cword_prefix)), action.help] for action in parser._actions if action.option_strings]) @@ -635,7 +646,7 @@ def display_completions(substitution, matches, longest_match_length): readline.set_completion_display_matches_hook(display_completions) """ - return self._display_completions + return {" ".join(k) if type(k) is tuple else k: v for k, v in self._display_completions.items()} class ExclusiveCompletionFinder(CompletionFinder): @staticmethod diff --git a/argcomplete/shell_integration.py b/argcomplete/shell_integration.py index f52cb9ae..5a394041 100644 --- a/argcomplete/shell_integration.py +++ b/argcomplete/shell_integration.py @@ -46,6 +46,7 @@ fishcode = r''' function __fish_%(executable)s_complete set -x _ARGCOMPLETE 1 + set -x _ARGCOMPLETE_DFS \t set -x _ARGCOMPLETE_IFS \n set -x _ARGCOMPLETE_SUPPRESS_SPACE 1 set -x _ARGCOMPLETE_SHELL fish diff --git a/docs/fish_help_string.png b/docs/fish_help_string.png new file mode 100644 index 0000000000000000000000000000000000000000..98c59d3fedaf12f74b8c54e92a853ec47294d497 GIT binary patch literal 14171 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 literal 0 HcmV?d00001 diff --git a/test/prog b/test/prog index f01d2bc3..076b10bc 100755 --- a/test/prog +++ b/test/prog @@ -31,12 +31,12 @@ def get_comp_point(*args, **kwargs): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers() -subparsers.add_parser('basic').add_argument('arg', choices=['foo', 'bar', 'baz']) +subparsers.add_parser('basic', help='basic help\nnext line of help').add_argument('arg', choices=['foo', 'bar', 'baz']) subparsers.add_parser('space').add_argument('arg', choices=['foo bar', 'baz']) subparsers.add_parser('cont').add_argument('arg').completer = complete_cont subparsers.add_parser('spec').add_argument('arg', choices=['d$e$f', 'd$e$g', 'x!x', r'y\y']) subparsers.add_parser('quote').add_argument('arg', choices=["1'1", '2"2']) -subparsers.add_parser('break').add_argument('arg', choices=['a:b:c', 'a:b:d']) +subparsers.add_parser('break', help="break help").add_argument('arg', choices=['a:b:c', 'a:b:d']) subparsers.add_parser('env').add_argument('arg').completer = check_environ subparsers.add_parser('debug').add_argument('arg').completer = print_output subparsers.add_parser('point', add_help=False).add_argument('arg', nargs='*').completer = get_comp_point diff --git a/test/test.py b/test/test.py index 5f127e81..34e8ad7e 100755 --- a/test/test.py +++ b/test/test.py @@ -74,8 +74,10 @@ def run_completer(self, parser, command, point=None, completer=autocomplete, **k with TemporaryFile() as t: os.environ["COMP_LINE"] = ensure_bytes(command) if USING_PYTHON2 else command os.environ["COMP_POINT"] = point - self.assertRaises(SystemExit, completer, parser, output_stream=t, - exit_method=sys.exit, **kwargs) + with self.assertRaises(SystemExit) as cm: + completer(parser, output_stream=t, exit_method=sys.exit, **kwargs) + if cm.exception.code != 0: + raise Exception("Unexpected exit code %d" % cm.exception.code) t.seek(0) return t.read().decode(sys_encoding).split(IFS) @@ -757,6 +759,30 @@ def test_shellcode_utility(self): sc = shellcode(["prog"], use_defaults=False, shell="woosh", complete_arguments=["-o", "nospace"]) sc = shellcode(["prog"], shell="fish") + def test_option_help(self): + os.environ["_ARGCOMPLETE_DFS"] = "\t" + os.environ["_ARGCOMPLETE_SUPPRESS_SPACE"] = "1" + os.environ["_ARGCOMPLETE_SHELL"] = "fish" + + p = ArgumentParser() + p.add_argument("--foo", help="foo" + IFS + "help") + p.add_argument("--bar", "--bar2", help="bar help") + subparsers = p.add_subparsers() + subparsers.add_parser("subcommand", help="subcommand help") + subparsers.add_parser("subcommand 2", help="subcommand 2 help") + + completions = self.run_completer(p, "prog --f") + self.assertEqual(set(completions), {"--foo\tfoo help"}) + + completions = self.run_completer(p, "prog --b") + self.assertEqual(set(completions), {"--bar\tbar help", "--bar2\tbar help"}) + + completions = self.run_completer(p, "prog sub") + self.assertEqual(set(completions), {"subcommand\tsubcommand help", "subcommand 2\tsubcommand 2 help"}) + + os.environ["_ARGCOMPLETE_DFS"] = "invalid" + self.assertRaises(Exception, self.run_completer, p, "prog --b") + class TestArgcompleteREPL(unittest.TestCase): def setUp(self): pass