Как использовать функции завершения 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
,