Я пытался добавить поддержку завершения bash в программу командной строки, которую я использовал в последнее время, но, похоже, я наткнулся на стену.
Вот команды и подкоманды, которые я хотел бы выполнять автоматически
Основная команда
foo
, для подкомандversion
,process
иhelp
должно выполняться автодополнение. Дальнейшее автодополнение зависит от подкоманды.Если пользователь вводит
-
после основной команды, автодополнение выполняет завершение для этих слов:--activate
или--deactivate
Если пользователь вводит
--deactivate
, он должен выполнить автодополнение вывода команды bash (скажем,ls
).
version
: автодополнение не выполняетсяprocess
: автозаполнение по умолчанию для списка каталогов (включая текущий и родительский)- If the user enters
-
, autocompletion performs completion for these words:--color
,--verbose
and then stops afterward
- If the user enters
Если пользователь вводит
help
, автодополнение будет для других подкоманд (process
илиversion
).
Вот моя текущая реализация скрипта автозаполнения (который плохо работает):
_foo() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
words=("${COMP_WORDS[@]}")
cword=$COMP_WORD
opts="process version help"
case "$prev" in
-*)
local subopts="--activate --deactivate"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
case "$cur" in
--deactivate)
COMPREPLY=( $(ls) )
;;
esac
;;
version)
COMPREPLY=()
;;
process)
case "$cur" in
-*)
local subopts="--color --verbose"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
;;
*)
COMPREPLY=( $(compgen -A directory))
;;
esac
;;
help)
COMPREPLY=( $(compgen -W "process version" -- ${cur}) )
;;
esac
}
complete -F _foo foo
Вы, наверное, видите, что Bash также не является моей сильной стороной. Я думал о написании отдельных функций bash для каждой подкоманды, но пока не знаю, как это сделать. Если у вас есть предложения о том, как реализовать это, я был бы очень признателен.
Спасибо!