Использование '=' в качестве триггера для завершения оболочки щелчка в моем приложении щелчка PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование '=' в качестве триггера для завершения оболочки щелчка в моем приложении щелчка Python

Сообщение Anonymous »

Введение
Странно, что в опциях модуля кликов поддонов можно анализировать параметр команды в формате '--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"
весь проект размещен на github по адресу туннельthrutime/beadroll. Он функционален, но без функций завершения, которые я сейчас создаю. Естественно, записывать длинную строку, как показано выше, утомительно, и я хотел бы сделать это как можно проще.
Камнем преткновения было завершение работы без пробелов в качестве триггера.
Это было сложно.
Что я пробовал
Я создал «Пользовательское завершение типов» и попробовал его на данный момент к моей опции --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)
так что с помощью класса и декоратора он в настоящее время завершает некоторые переменные env, которые, как я думал, могут заполнить пространство, пока я не получу завершение, работающее так, как я хотел.
Так что я не знаю У меня нет четкого понимания того, как генерировать триггеры для завершения. Я хотел бы, чтобы --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)
]

это не влияет на основное действие, при котором нажатие клавиши Tab после ввода --uid= удаляет все шесть символов, а нажатие после --uid запускает завершение.
Возможно, когда я отдохну от этого, я смогу увидеть, где я ошибся.
Один из способов, которым это могло бы работать, — это переписать базовую команду, чтобы она приняла два параметра и написал их, чтобы позже назначить одной и той же паре значений.
Что-то вроде этого ответа

Подробнее здесь: https://stackoverflow.com/questions/778 ... -applicati
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»