hanneskod/comphlete

从 PHP 动态生成 bash 完整性

1.0.0-beta6 2020-02-18 11:49 UTC

This package is auto-updated.

Last update: 2024-09-18 21:26:54 UTC


README

Packagist Version Build Status

从 PHP 动态生成 bash 完整性

为什么?

假设你有一个命令行脚本来读取一些数据,使用 comphlete 你可以直接从命令行自动完成数据标识符。这既有趣又强大。并且与 symfony 控制台应用程序配合良好。

安装

composer require hanneskod/comphlete

用法

在 symfony 应用程序中使用

创建一个空的 symfony 控制台应用程序(这里命名为 myapp.php)。

$application = new \Symfony\Component\Console\Application();

$application->add(new \hanneskod\comphlete\Symfony\ComphleteCommand);

$application->run();

这创建了一个名为 _complete 的隐藏命令,用于处理自动完成。

要在你的环境中注册自动完成,使用(在 .bashrc 中)

source $(myapp.php _complete --generate-bash-script --app-name=myapp.php)

注意,ComphleteCommand 对于单命令应用程序不起作用。如果你的应用程序是单命令应用程序,你将不得不回到创建建议的默认方式。请参阅以下内容。

(不那么)困难的方法

在你的 php 脚本中创建你的自动完成定义(这里命名为 test.php)。

namespace hanneskod\comphlete;

$definition = (new Definition)
    // first argument with a fixed set of suggestions
    ->addArgument(0, ['foo', 'bar', 'baz'])

    // second argument with a dynamic callback
    ->addArgument(1, function () {
        // load suggestions from database...
        return ['aa', 'bb'];
    })

    // simple option
    ->addOption('foo')

    // option with suggested values
    ->addOption('bar', ['val1', 'val2'])
;

$completer = new Completer($definition);

$input = (new InputFactory)->createFromArgv($argv);

echo Helper::dump($completer->complete($input));

要加载到你的环境中,创建一个 bash 脚本(请注意,这要求 test.php 在你的 PATH 中才能正常工作)。

php bash_load_script_template.php test.php > load.sh

并使用它(在 .bashrc 中)

source load.sh

使用上下文

一个常见的模式是让应用程序定义一组具有自己的参数和选项的命令。Comphlete 通过上下文支持这一点。这里有一个具有 importexport 命令的应用程序。

$import = (new ContextDefinition('import'))
    ->addArgument(1, ['some-argument'])
;

$export = (new ContextDefinition('export'))
    ->addArgument(1, ['another-argument'])
;

$def = (new ContextContainerDefinition)
    ->addContext($import)
    ->addContext($export)
;

$completer = new Completer($def);

$input = (new InputFactory)->createFromArgv($argv);

echo Helper::dump($completer->complete($input));