Bash автозаполнение по пользовательской команде, вызывая себя - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь добавить функцию автозаполнения в пользовательскую команду 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 (по крайней мере, на мой взгляд). Итак, теперь я предполагаю, что существует некоторая проблема, связанная с вызовом команды из собственного сценария автозаполнения. Это то, что просто невозможно? Или я что-то здесь упускаю?

Это было непросто объяснить, надеюсь, это имеет смысл!

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