1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-23 16:40:24 +02:00

38964: _git-config: Complete option names present in the config file.

This patch lets
.
    git config x.y.z value
    git config <TAB>
.
complete 'x.y.z', even if x.y.z isn't hardcoded into _git-config.
This commit is contained in:
Daniel Shahaf 2016-07-29 17:00:08 +00:00
parent b056d8c909
commit faa163cd5f
2 changed files with 49 additions and 0 deletions

View file

@ -2459,6 +2459,39 @@ _git-config () {
${${${(0)"$(_call_program gettable-options git config -z --list)"}%%$'\n'*}//:/\\:}
)
# Add to $git_options options from the config file that aren't already in $git_options.
() {
local -a -U sections_that_permit_arbitrary_subsection_names=(
alias
pager
pretty
remotes
${(u)${(M)${git_options%%:*}:#*[.][*][.]*}%%.*}
)
local key
for key in $git_present_options ; do
if (( ${+git_options[(r)(#i)${(b)key}:*]} )); then
# $key is already in git_options
continue
elif (( ${+sections_that_permit_arbitrary_subsection_names[(r)${(b)key%%.*}]} )); then
if [[ $key == *.*.* ]]; then
# If $key isn't an instance of a known foo.*.bar:baz $git_options entry...
if ! (( ${+git_options[(r)(#i)${(b)key%%.*}.[*].${(b)key##*.}:*]} )); then
# ... then add it.
git_options+="${key}:unknown option name"
fi
else
# $key is of the form "foo.bar" where 'foo' is known
# No need to add it; "foo.<TAB>' will find 'bar' via another codepath later
# ### TODO: that "other codepath" will probably run git config -z again, redundantly.
continue
fi
else
git_options+="${key}:unknown option name"
fi
done
}
case $state in
(section)
__git_config_sections -b '(|)' '^' section-names 'section name' $* && ret=0
@ -2539,6 +2572,8 @@ _git-config () {
# following functions don't generate any output in the case of
# multi-level options.
case $IPREFIX in
# Note: If you add a branch to this 'case' statement,
# update $sections_that_permit_arbitrary_subsection_names.
(alias.)
__git_aliases && ret=0
;;
@ -2596,6 +2631,10 @@ _git-config () {
(svn-remote.)
__git_svn-remotes -S . && ret=0
;;
(*.)
local -a existing_subsections=( ${${${(M)git_present_options:#${IPREFIX}*.*}#${IPREFIX}}%.*} )
_describe -t existing-subsections "existing subsections" existing_subsections -S . && ret=0
;;
esac
else
sections=(
@ -2658,6 +2697,13 @@ _git-config () {
web:'web options'
svn:'git svn options'
svn-remote:'git svn remotes')
() {
local i
for i in ${(u)git_present_options%%.*}; do
(( ${+sections[(r)(#i)${(b)i}:*]} )) ||
sections+="${i}:unknown section name"
done
}
fi
# TODO: Add equivalent of -M 'r:|.=* r:|=*' here so that we can complete