У меня есть командная строка PHP script, которая запускает задание на сервер задания, причем задание является аргументом. Имена заданий именуются такими именами, как Foo: Bar_Baz_JobName. Есть ли способ реализовать автоматическое завершение, например, как ввести первые несколько букв имени файла и нажать вкладку bash, чтобы завершить имя файла для вас. Я знаю, что это можно сделать, потому что выполнение табуляции работает на ubuntu с apt-get, я просто не знаю, можно ли это сделать в PHP.
Bash/php - любой способ реализовать ключ автозаполнения ключа для аргументов?
Ответ 1
Автозаполнение выполняется с использованием библиотеки readline GNU, которая, по-видимому, доступна из PHP. В частности, посмотрите readline_completion_function
. Использование довольно просто; вы вызываете readline_completion_function
с одним аргументом, функцию обратного вызова, которая обрабатывает завершение. Функция обратного вызова принимает первые несколько букв (в основном, независимо от того, что вы вводите до нажатия TAB) в качестве входных данных и должна возвращать массив возможных совпадений.
Ответ 2
Да! вы можете сделать это с помощью PHP!
Команда CLIFramework предоставляет команду для генерации bash завершения script по вашим определениям команд.
Вы также можете определить свое завершение аргумента в PHP, сгенерированное завершение bash/zsh вернет результат выполнения из PHP во время выполнения:
https://github.com/c9s/CLIFramework
Screencast (bash):
Screencast (zsh):
Ответ 3
Вы можете попробовать readline, точнее, функцию readline_completion_function
.
Ответ 4
О readline_completion_function
Я бы сказал, что учитывая тип взаимодействия, которое вы ищете (apt-get autocomplete) этот метод не является хорошим.
Фактически перед тем, как получить функцию автозаполнения, вам нужно запустить script, а затем вы получите доступ к функции автозаполнения.
Функция автозаполнения является частичной. Таким образом, это как автозаполнение 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 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 script для расширения автозаполнения bash или zsh.
Итак, это зависит от оболочки, которую вы используете, так как вы должны сделать автозаполнение.
Некоторые ссылки:
- автозаполнение zsh
- bash автозаполнение
- автозаполнение рыбы (ссылка больше ориентирована на python, чем php...)