From e1a6ad216711a894aa6d81c303dff6be6e8053a3 Mon Sep 17 00:00:00 2001 From: Olivier Mangin Date: Fri, 12 May 2017 19:02:35 -0400 Subject: [PATCH] Adds basic tag completion. --- pubs/commands/tag_cmd.py | 8 +++++--- pubs/completion.py | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/pubs/commands/tag_cmd.py b/pubs/commands/tag_cmd.py index c37eac4..b5031f9 100644 --- a/pubs/commands/tag_cmd.py +++ b/pubs/commands/tag_cmd.py @@ -24,16 +24,17 @@ from ..uis import get_ui from .. import pretty from .. import color from ..utils import resolve_citekey -from ..completion import CiteKeyCompletion +from ..completion import CiteKeyOrTagCompletion, TagModifierCompletion def parser(subparsers, conf): parser = subparsers.add_parser('tag', help="add, remove and show tags") parser.add_argument('citekeyOrTag', nargs='?', default=None, - help='citekey or tag.').completer = CiteKeyCompletion(conf) + help='citekey or tag.').completer = CiteKeyOrTagCompletion(conf) parser.add_argument('tags', nargs='?', default=None, help='If the previous argument was a citekey, then ' - 'a list of tags separated by a +.') + 'a list of tags separated by + and -.' + ).completer = TagModifierCompletion(conf) # TODO find a way to display clear help for multiple command semantics, # indistinguisable for argparse. (fabien, 201306) return parser @@ -71,6 +72,7 @@ def _tag_groups(tags): minus_tags.append(tag[1:]) return set(plus_tags), set(minus_tags) + def command(conf, args): """Add, remove and show tags""" diff --git a/pubs/completion.py b/pubs/completion.py index 3752cb3..f05fe36 100644 --- a/pubs/completion.py +++ b/pubs/completion.py @@ -1,4 +1,4 @@ -from . import repo +import re try: import argcomplete except ModuleNotFoundError: @@ -14,6 +14,8 @@ except ModuleNotFoundError: argcomplete = FakeModule() +from . import repo + def autocomplete(parser): argcomplete.autocomplete(parser) @@ -36,3 +38,22 @@ class CiteKeyCompletion(BaseCompleter): def _complete(self, **kwargs): rp = repo.Repository(self.conf) return rp.citekeys + + +class CiteKeyOrTagCompletion(BaseCompleter): + + def _complete(self, **kwargs): + rp = repo.Repository(self.conf) + return rp.citekeys.union(rp.get_tags()) + + +class TagModifierCompletion(BaseCompleter): + + regxp = r"[^:+-]*$" # prefix of tag after last separator + + def _complete(self, prefix, **kwargs): + tags = repo.Repository(self.conf).get_tags() + start, _ = re.search(self.regxp, prefix).span() + partial_expr = prefix[:start] + t_prefix = prefix[start:] + return [partial_expr + t for t in tags if t.startswith(t_prefix)]