Group completion matches

This commit is contained in:
Kovid Goyal 2018-08-23 15:34:54 +05:30
parent 16764c79b2
commit 8ba3c4ba50
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -10,9 +10,8 @@ parsers, serializers = {}, {}
class Completions: class Completions:
def __init__(self, description=None): def __init__(self):
self.matches = {} self.match_groups = {}
self.description = description
def input_parser(func): def input_parser(func):
@ -36,30 +35,33 @@ def zsh_input_parser(data):
@output_serializer @output_serializer
def zsh_output_serializer(ans): def zsh_output_serializer(ans):
output = ['compadd', '--'] lines = []
for word, description in ans.matches.items(): for description, matches in ans.match_groups.items():
output = ['compadd', '-J', shlex.quote(description), '-X', shlex.quote(description), '--']
for word, description in matches.items():
output.append(shlex.quote(word)) output.append(shlex.quote(word))
return ' '.join(output) lines.append(' '.join(output) + ';')
return '\n'.join(lines)
def completions_for_first_word(ans, prefix, entry_points, namespaced_entry_points): def completions_for_first_word(ans, prefix, entry_points, namespaced_entry_points):
ans.matches.update({ ans.match_groups['Entry points'] = {
k: None for k in k: None for k in
list(entry_points) + ['+' + k for k in namespaced_entry_points] list(entry_points) + ['+' + k for k in namespaced_entry_points]
if not prefix or k.startswith(prefix) if not prefix or k.startswith(prefix)
}) }
def kitty_cli_opts(prefix=None): def kitty_cli_opts(ans, prefix=None):
from kitty.cli import options_for_completion from kitty.cli import options_for_completion
ans = {} matches = {}
for opt in options_for_completion(): for opt in options_for_completion():
if isinstance(opt, str): if isinstance(opt, str):
continue continue
aliases = frozenset(x for x in opt['aliases'] if x.startswith(prefix)) if prefix else opt['aliases'] aliases = frozenset(x for x in opt['aliases'] if x.startswith(prefix)) if prefix else opt['aliases']
for alias in aliases: for alias in aliases:
ans[alias] = opt['help'].strip() matches[alias] = opt['help'].strip()
return ans ans.match_groups['Options'] = matches
def find_completions(words, new_word, entry_points, namespaced_entry_points): def find_completions(words, new_word, entry_points, namespaced_entry_points):
@ -70,7 +72,7 @@ def find_completions(words, new_word, entry_points, namespaced_entry_points):
if not words or (len(words) == 1 and not new_word): if not words or (len(words) == 1 and not new_word):
prefix = words[0] if words else '' prefix = words[0] if words else ''
completions_for_first_word(ans, prefix, entry_points, namespaced_entry_points) completions_for_first_word(ans, prefix, entry_points, namespaced_entry_points)
ans.matches.update(kitty_cli_opts(prefix)) kitty_cli_opts(ans, prefix)
return ans return ans
return ans return ans