встроенное завершение
дополнение для git clone (воспроизведено ниже) дает завершение табуляции для --*
опций:
_git_clone ()
{
case "$cur" in
--*)
__gitcomp_builtin clone
return
;;
esac
}
bash-completion 1.x (старый bash)
(для конкретного случая macos high sierra + brew установил bash-completion / git)
В мире bash-completion 1.x, чтобы переопределить это, я бы (в .bashrc
/.bash_profile
) определил свою собственную функцию завершения _git_clone
:
# https://github.com/scop/bash-completion/blob/d2f14a7/bash_completion#L498
__ltrim_colon_completions() {
if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
# Remove colon-word prefix from COMPREPLY items
local colon_word=${1%"${1##*:}"}
local i=${#COMPREPLY[*]}
while [[ $((--i)) -ge 0 ]]; do
COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
done
fi
}
_git_clone() {
case "$cur" in
--*)
__gitcomp_builtin clone
return
;;
*)
argc=0
for word in "${words[@]}"; do
case "$word" in
git|clone|--*)
continue
;;
*)
argc=$((argc + 1))
;;
esac
done
if [ $argc -le 1 ]; then
__gitcomp "https://github.com/git/git https://github.com/python/cpython"
__ltrim_colon_completions "$cur"
fi
;;
esac
}
Это прекрасно работает:
(Последовательность, которую я набрал здесь, была git clone h<tab><tab>g<tab>
)
$ git clone https://github.com/
//github.com/git/git //github.com/python/cpython
$ git clone https://github.com/git/git
bash-дополнение 2.x
(для конкретного примера: стоковый Ubuntu Bionic (18.04))
В bash-completion 2.x модель переключается на динамически загружаемую конфигурацию. Это означает, что при завершении вкладки git
срабатывает __load_completion
, находит завершение git по пути его установки и получает его.
Определение моей собственной функции завершения _git_clone
в .bashrc
/ .bash_profile
теперь бесполезно, поскольку она забивается файлом завершения из динамических источников.
Я могу определить собственное завершение git
в этом каталоге:
local -a dirs=( ${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions )
(например, ~/.local/share/bash-completion/completions/git.bash
). Однако это отключает все остальные git
завершения!
Как сделать так, чтобы в этой модели работало мое индивидуальное завершение вкладок clone
(и продолжало работать завершение по умолчанию)?
Неприемлемые решения:
- Изменить системные упакованные файлы:
/usr/share/bash-completion/completions/git
. Этот файл управляетсяapt
.
__load_completion
самостоятельно, а затем переопределить, как раньше? - person o11c   schedule 22.01.2019