Нажмите пользовательские несколько команд вместе с завершением bash

Я следовал примеру из документации Click для реализации пользовательских мультикоманд, а затем я хочу объединить это с поддержкой завершения Bash, как описано здесь. Результат, когда я пытаюсь завершить с помощью TAB, заключается в том, что «cli» вставляется после имени моей программы вместо пользовательских команд...

$ mycommand <Press TAB 2x>
$ mycommand cli

Не то чтобы ни одна из моих пользовательских мультикоманд не называлась «cli».

Есть ли способ обойти это?

(Копия пользовательского примера кода с несколькими командами ниже)

import click
import os

plugin_folder = os.path.join(os.path.dirname(__file__), 'commands')

class MyCLI(click.MultiCommand):

    def list_commands(self, ctx):
        rv = []
        for filename in os.listdir(plugin_folder):
            if filename.endswith('.py'):
                rv.append(filename[:-3])
        rv.sort()
        return rv

    def get_command(self, ctx, name):
        ns = {}
        fn = os.path.join(plugin_folder, name + '.py')
        with open(fn) as f:
            code = compile(f.read(), fn, 'exec')
            eval(code, ns, ns)
        return ns['cli']

cli = MyCLI(help='This tool\'s subcommands are loaded from a '
            'plugin folder dynamically.')

if __name__ == '__main__':
    cli()

person Ermingol    schedule 12.05.2020    source источник


Ответы (2)


Кажется важным, чтобы для автозавершения кликов имя вашей подкоманды было таким:

@click.command(name="<YOUR_CMD_NAME>")

Затем все, что вам нужно сделать, это установить правильный env var, как описано в документации .

eval "$(_FOO_BAR_COMPLETE=source_bash foo-bar)"

person Vhash    schedule 10.11.2020

В моем случае группа используется как подгруппа, а имя по умолчанию — «cli».
Назначьте имя для группы. ns['cli'].name = name
попробуйте следующее:

def get_command(self, ctx, name):
    ns = {}
    fn = os.path.join(plugin_folder, name + '.py')
    with open(fn) as f:
        code = compile(f.read(), fn, 'exec')
        eval(code, ns, ns)
    ns['cli'].name = name
    return ns['cli']
person Chen YenHsun    schedule 08.06.2021