首页 > 解决方案 > 单击自定义多命令和 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()

标签: python-3.xpython-click

解决方案


点击自动完成将您的子命令命名为如下所示似乎很重要:

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

然后您所要做的就是按照文档中的说明设置正确的 env var 。

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


推荐阅读