Я пытаюсь добавить функцию автозаполнения в пользовательскую команду bash, в первую очередь следуя этому руководству . Учебное пособие демонстрирует отображение предложений динамического автозаполнения с использованием вывода fc -l
. В моем случае я хотел бы отобразить динамические предложения, основанные на выводе самой пользовательской команды . По сути, при вызове без аргументов команда выводит список доступных «задач». Эти задачи формируют аргументы, которые может принять команда.
Использование fc -l
согласно учебнику работает правильно. Однако, если я просто заменим использование fc -l
своей пользовательской командой, вместо того, чтобы получать предложения автозаполнения, когда я нажму double- tab , я получу то, что похоже на буквенные символы табуляции, введенные в консоль (илипо крайней мере, эквивалентное количество пробелов).
Фактическая команда вызывает скрипт Python, который выполняет реальную работу, и задачи определяются в отдельном файле конфигурации Python, в котором читается скрипт. Но я сократил своипроблема в паре сценариев bash для демонстрационных целей.
Во-первых, у меня есть dothis
, сценарий bash, который просто выводит на экран жестко закодированный пример того, что настоящая команда может выводить при вызове без аргументов:
#/usr/bin/env bash
echo "Available tasks:"
echo
echo "one: This is a task"
echo "two: This is a task"
echo "three: This is a task"
Тогда есть dothis-completion.bash
:
_dothis_completions()
{
IFS=$'\n'
#local tasks=$(dothis | grep -E '^\w+:.+$' | sed -E 's/:.+$//')
local tasks=$(fc -l -5 | sed 's/\t//')
COMPREPLY=( $(compgen -W "$tasks" -- "${COMP_WORDS[1]}") )
}
complete -F _dothis_completions dothis
Это показывает как рабочий пример (local tasks=$(fc -l...
), так и нерабочий пример (local tasks=$(dothis...
, закомментировано).
Если я source dothis-completion.bash
и наберу dothis
пробел табуляция табуляция , я получу ожидаемые предложения автозаполнения. Если я закомментирую использование fc -l
и прокомментирую использование самого dothis
, source
файла еще раз и введите dothis
пробел tab вкладка , получаю следующее. Символ #
указывает положение курсора после нажатия двойной - табуляция :
$ dothis #
Продолжая нажимать табуляция продолжает вставлять больше символов табуляции / пробела.
Сначала я предположил, что с танцем grep
/ sed
возникла проблема с извлечением имен задач из выходных данных, но отображение результата переменной tasks
выглядит нормально и функционально эквивалентноформатированный вывод fc -l
(по крайней мере, на мой взгляд). Итак, теперь я предполагаю, что существует некоторая проблема, связанная с вызовом команды из собственного сценария автозаполнения. Это то, что просто невозможно? Или я что-то здесь упускаю?
Это было непросто объяснить, надеюсь, это имеет смысл!