Как использовать функции завершения bash, которые определяются на лету?

Я пытаюсь добавить завершение для псевдонима: alias m='man',
Итак, я добавил complete -F _man m к моему .bashrc,

Проблема в том, что функция _man используется для завершения, не определяется в начале сеанса bash, но определяется при выполнении первого соревнования по табу на $ man команда.
Так: $ complete -p | grep _man может либо ничего не вернуть, либо вернуть:

complete -F _man man
complete -F _man apropos
complete -F _man whatis

Поэтому, когда я пытаюсь завершить на $ m Команда, я могу получить:

$ m -bash: completing : function « _man » not found
$ m

И у меня такая же проблема с функциями _aptitude а также _apt-get


То, что я хотел бы, это использовать мой .bashrc форсировать создание функций _man , _aptitude , _apt-get как только начинается bash.
Может быть, это возможно с помощью compgen встроенный.

Моя версия bash:
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

Спасибо за прочтение.


Редактировать: На самом деле, подобный вопрос уже существует и получил ответ:
bash-extension - функция завершения, определенная при первом вызове команды -

1 ответ

Решение

У вас в вашем .bashrc:

alias m='man'
complete -F _man m

Просто добавь:

_completion_loader man

Тогда ваши доработки на $ m будет работать нормально, даже без выполнения табуляции на $ man до.

_completion_loader не могут быть определены в вашем дистрибутиве. Вот копия кода, найденного в.bashrc Ubuntu 14.04:

_completion_loader () 
{ 
    local compfile=./completions;
    [[ $BASH_SOURCE == */* ]] && compfile="${BASH_SOURCE%/*}/completions";
    compfile+="/${1##*/}";
    [[ -f "$compfile" ]] && . "$compfile" &> /dev/null && return 124;
    complete -F _minimal "$1" && return 124
}

На самом деле, чтобы избежать генерации _man функция дважды, вы также должны изменить строку
complete -F _man m в
complete -F _man man m,

Другие вопросы по тегам