Bash / php - любой способ реализовать автозаполнение клавиши табуляции для аргументов? - PullRequest
14 голосов
/ 09 июля 2010

У меня есть скрипт командной строки PHP, который запускает задание на сервер заданий, а имя задания является аргументом. Имена заданий располагаются в пространстве имен, например Foo: Bar_Baz_JobName. Есть ли способ, которым я мог бы реализовать автозаполнение, например, как набор первых нескольких букв имени файла и нажатие клавиши Tab Bash завершает имя файла для вас. Я знаю, что это можно сделать, потому что завершение табуляции работает в Ubuntu с помощью apt-get, я просто не знаю, можно ли это сделать в PHP.

Ответы [ 4 ]

10 голосов
/ 09 июля 2010

Автозаполнение выполняется с помощью библиотеки readline GNU, которая, по-видимому, доступна из PHP.В частности, посмотрите на readline_completion_function.Использование довольно просто;Вы вызываете readline_completion_function с одним аргументом, функцию обратного вызова, которая обрабатывает завершение.Функция обратного вызова принимает первые несколько букв (в основном, независимо от того, что вы вводите перед нажатием клавиши TAB) и должна возвращать массив возможных совпадений.

5 голосов
/ 14 февраля 2015

Да! Вы можете сделать это с помощью PHP!

CLIFramework предоставляет команду, которая поможет вам сгенерировать сценарий завершения bash по вашим определениям команд.

Вы также можете определить завершение аргумента в PHP, сгенерированное завершение bash / zsh вернет результат выполнения из PHP во время выполнения:

https://github.com/c9s/CLIFramework

Скринкаст (bash):

enter image description here

Скринкаст (zsh):

enter image description here

2 голосов
/ 07 июля 2017

О функции readline_completion_function

Я бы сказал, что, учитывая тип взаимодействия, которое вы ищете (apt-get autocomplete), этот метод не годится.

Фактически, прежде чем получить функцию автозаполнениявам нужно запустить скрипт, и вы получите доступ к функции автозаполнения.

Функция автозаполнения является частичной.Итак, это как автозаполнение bash, а не zsh.

В оболочке:

➜  ~ php test.php (enter) 
Custom command: (tab)
a b c
Custom command: (tab)
a b c

Код:

<?php
// test.php
class AutoController
{

    private static function getCommandsArray()
    {
        $my_dir = array('a', 'b', 'c');
        return $my_dir;
    }

    /**
     * The callback which is returning an array with strings, which will be
     * auto-completed.
     *
     * @param $input
     * @param $index
     * @return array
     */
    private static function completionCallback($input, $index)
    {
        return self::getCommandsArray();
    }

    /**
     * The method which is handling the autocompletion. After it's runned, you can
     * autocomplete your commands by hitting the tab-button.
     */
    public function actionCompl()
    {
        readline_completion_function(array('self', 'completionCallback'));

        $command_input = readline("Custom command: ");

        passthru('echo ' . $command_input);
    }
}

$a = new AutoController();
$a->actionCompl();

Об автозаполнении во время выполнения

Как предлагает c9s , можно получить такую ​​функциональность, но extending функциональность автозаполнения вашего bash, а не с PHP.

Итак, если вы видите функцию автозаполнения CLIFramework , например, вы увидите:

BashGenerator.php
ZshGenerator.php

, которая используется для генерации скрипта bash для расширения автозаполнения bash или zsh,

Таким образом, от используемой вами оболочки зависит способ выполнения автозаполнения.

Некоторые ссылки:

2 голосов
/ 09 июля 2010

Вы можете попробовать использовать readline , точнее, функцию readline_completion_function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...