Странно, что в опциях модуля кликов поддонов можно анализировать параметр команды в формате '--option=value', где значение представляет собой строку, и это эквивалентно '--option value', где значение снова является строкой, но при инициализации завершения оболочки в базе кода клика с использованием '--option=' не будет работать, а '- -option ' будет генерировать дополнения.
Я написал интерфейс командной строки, в котором одна опция принимает строку и разбивает ее на
словарь. Строка анализируется как пары ключ-значение, разделенные запятыми, где ключ и значение разделены знаком равенства. Интерфейс командной строки представляет собой генератор файлов ics, управляемый базой данных, который сохраняет события, которые вы добавляете в него, используя такие записи, как показано ниже:
Код: Выделить всё
beadroll add --alarms="alarm=last minute, trigger=-1m, summary=get ready, alarm=five minutes, trigger=-5m, summary=steady time, alarm=feeder, trigger=-15m, summary=start preparations, alarm=soul, trigger=-30m, summary=preparations" \
"Lunch with Rabbit" \
"2023-10-15T01:45:00-04:00" \
"2023-10-15T01:44:00-04:00"
Камнем преткновения было завершение работы без пробелов в качестве триггера.
Это было сложно.
Что я пробовал
Я создал «Пользовательское завершение типов» и попробовал его на данный момент к моей опции --uid.
Код: Выделить всё
class EnvVarType(click.ParamType):
name = "envvar"
def shell_complete(self, ctx, param, incomplete):
return [
click.shell_completion.CompletionItem(name)
for name in os.environ if name.startswith(incomplete)
]
def resolve_completer(self, ctx, incomplete):
if ctx.args:
# Get the last argument from partial_args
last_arg = ctx.args[-1]
if last_arg.startswith("--") and "=" in last_arg:
# Split the argument into option name and value
option, value = last_arg.split("=")
if ctx.command.get_params(ctx)[option].type is self:
# Trigger completion based on the value
return self.shell_complete(ctx, None, value)
return super().resolve_completer(ctx, incomplete)
Код: Выделить всё
@cli.command()
@click.option('--alarms', type=EnvVarType(), default=None)
Так что я не знаю У меня нет четкого понимания того, как генерировать триггеры для завершения. Я хотел бы, чтобы --alarms="\ генерировал завершение, а затем каждый последующий символ работал как триггер, пока двойная кавычка не будет закрыта.
Не похоже, что моя функция resolve_completer связана с моей функцией shell_complete или что ctx.args запускается так, как мне хотелось бы.< /p>
Мне интересно, написал ли кто-нибудь что-то подобное и знает правильный способ инициализации триггера.
Я видел реализации, в которых программисты использовали понимание списка для итерации
через параметры в пределах области действия команды, но я не уверен, как можно связать такой цикл с поведением функции оболочки_completion.
Даже когда я пытаюсь использовать операторы if, такие как,
Код: Выделить всё
class EnvVarType(click.ParamType):
name = "envvar"
def shell_complete(self, ctx, param, incomplete):
if "=" in click.Context(click.Command('add')).args:
return [
click.shell_completion.CompletionItem(name)
for name in ['alarm=', 'trigger=', 'summary='] if name.startswith(incomplete)
]
elif "=" in ctx.args:
return [
click.shell_completion.CompletionItem(name)
for name in os.environ if name.startswith(incomplete)
]
else:
return [
click.shell_completion.CompletionItem(name)
for name in ['alarm=', 'trigger=', 'summary=', 'other='] if name.startswith(incomplete)
]
Возможно, когда я отдохну от этого, я смогу увидеть, где я ошибся.
Один из способов, которым это могло бы работать, — это переписать базовую команду, чтобы она приняла два параметра и написал их, чтобы позже назначить одной и той же паре значений.
Что-то вроде этого ответа
Подробнее здесь: https://stackoverflow.com/questions/778 ... -applicati