Ответ 1
Для псевдонимов git функция автозаполнения для команды git (__git()
) использует вызов git config --get "alias.$1"
для определения эквивалентной функции автозаполнения. Это работает для простых сопоставлений, но будет забивать более сложные псевдонимы.
Чтобы обойти это, определите функцию автозаполнения с именем, которое соответствует вашему псевдониму, т.е. _git_tagarchive()
. Функция автозаполнения для git должна выбрать это и использовать для автозаполнения.
Например:
[[email protected]]$ git tagarchive <TAB><TAB>
AUTHORS gentleSelect/ .gitignore LICENSE test_multiple.html
cron/ .git/ index.html README.md
[[email protected]]$ _git_tagarchive() {
> _git_branch # reuse that of git branch
> }
[[email protected]]$ git tagarchive <TAB><TAB>
enable_multiple master origin/gh-pages v0.1 v0.1.3
FETCH_HEAD ORIG_HEAD origin/HEAD v0.1.1 v0.1.3.1
HEAD origin/enable_multiple origin/master v0.1.2
Для более постоянного решения просто добавьте определение функции в ваш файл bashrc
. Например:
_git_tagarchive()
{
_git_branch
}
Обратите внимание, что я просто повторно использовал функцию автозаполнения для git branch
; вы можете изменить это на что-то более подходящее или написать свой собственный.
Дополнительная информация
Это решение было идентифицировано на основе исследования /etc/bash_completion.d/git
.
Как правило, команды с псевдонимом git обрабатываются функцией __git_aliased_commands()
, которая анализирует вывод git config --get "alias.$1"
, чтобы решить, какую функцию автозаполнения использовать. Использование более сложной команды оболочки в качестве цели псевдонима, по понятным причинам, преодолело бы этот подход.
Далее, функция автозаполнения для цепей git (_git()
) в функции автозаполнения для подкоманд путем простого добавления функции с помощью _git_
(с тире (-
) в команде, замененной символами подчеркивания), Это делается до проверки __git_aliased_command()
, поэтому мы можем использовать это.
_git ()
{
# .....
local completion_func="_git_${command//-/_}"
declare -f $completion_func >/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi
}
Таким образом, подход, который я получил, заключается в том, чтобы гарантировать, что существует функция, соответствующая вашему псевдониму, т.е. _git_tagarchive()
.