Updated git completion. Fixes #299.

pull/456/head
Omer Katz 2015-04-21 11:29:45 +03:00
parent 1cf7a9b7ad
commit bd6b4d8a28
1 changed files with 79 additions and 30 deletions

View File

@ -16,11 +16,17 @@
# #
# To use these routines: # To use these routines:
# #
# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh). # 1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
# 2) Add the following line to your .bashrc/.zshrc: # 2) Add the following line to your .bashrc/.zshrc:
# source ~/.git-completion.sh # source ~/.git-completion.bash
# 3) Consider changing your PS1 to also show the current branch, # 3) Consider changing your PS1 to also show the current branch,
# see git-prompt.sh for details. # see git-prompt.sh for details.
#
# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style. For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion. This also works with aliases
# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
case "$COMP_WORDBREAKS" in case "$COMP_WORDBREAKS" in
*:*) : great ;; *:*) : great ;;
@ -180,7 +186,7 @@ fi
__gitcompappend () __gitcompappend ()
{ {
local i=${#COMPREPLY[@]} local x i=${#COMPREPLY[@]}
for x in $1; do for x in $1; do
if [[ "$x" == "$3"* ]]; then if [[ "$x" == "$3"* ]]; then
COMPREPLY[i++]="$2$x$4" COMPREPLY[i++]="$2$x$4"
@ -275,16 +281,12 @@ __gitcomp_file ()
# argument, and using the options specified in the second argument. # argument, and using the options specified in the second argument.
__git_ls_files_helper () __git_ls_files_helper ()
{ {
(
test -n "${CDPATH+set}" && unset CDPATH
cd "$1"
if [ "$2" == "--committable" ]; then if [ "$2" == "--committable" ]; then
git diff-index --name-only --relative HEAD git -C "$1" diff-index --name-only --relative HEAD
else else
# NOTE: $2 is not quoted in order to support multiple options # NOTE: $2 is not quoted in order to support multiple options
git ls-files --exclude-standard $2 git -C "$1" ls-files --exclude-standard $2
fi fi 2>/dev/null
) 2>/dev/null
} }
@ -382,7 +384,8 @@ __git_refs ()
;; ;;
*) *)
echo "HEAD" echo "HEAD"
git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##" git for-each-ref --format="%(refname:short)" -- \
"refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
;; ;;
esac esac
} }
@ -408,12 +411,9 @@ __git_refs_remotes ()
__git_remotes () __git_remotes ()
{ {
local i IFS=$'\n' d="$(__gitdir)" local d="$(__gitdir)"
test -d "$d/remotes" && ls -1 "$d/remotes" test -d "$d/remotes" && ls -1 "$d/remotes"
for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do git --git-dir="$d" remote
i="${i#remote.}"
echo "${i/.url*/}"
done
} }
__git_list_merge_strategies () __git_list_merge_strategies ()
@ -516,7 +516,7 @@ __git_complete_index_file ()
;; ;;
esac esac
__gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_" __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
} }
__git_complete_file () __git_complete_file ()
@ -781,6 +781,10 @@ __git_aliased_command ()
-*) : option ;; -*) : option ;;
*=*) : setting env ;; *=*) : setting env ;;
git) : git itself ;; git) : git itself ;;
\(\)) : skip parens of shell function definition ;;
{) : skip start of shell helper function ;;
:) : skip null command ;;
\'*) : skip opening quote after sh -c ;;
*) *)
echo "$word" echo "$word"
return return
@ -973,7 +977,7 @@ _git_branch ()
case "$cur" in case "$cur" in
--set-upstream-to=*) --set-upstream-to=*)
__gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}" __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
;; ;;
--*) --*)
__gitcomp " __gitcomp "
@ -1041,7 +1045,7 @@ _git_checkout ()
_git_cherry () _git_cherry ()
{ {
__gitcomp "$(__git_refs)" __gitcomp_nl "$(__git_refs)"
} }
_git_cherry_pick () _git_cherry_pick ()
@ -1165,8 +1169,8 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
--full-index --binary --abbrev --diff-filter= --full-index --binary --abbrev --diff-filter=
--find-copies-harder --find-copies-harder
--text --ignore-space-at-eol --ignore-space-change --text --ignore-space-at-eol --ignore-space-change
--ignore-all-space --exit-code --quiet --ext-diff --ignore-all-space --ignore-blank-lines --exit-code
--no-ext-diff --quiet --ext-diff --no-ext-diff
--no-prefix --src-prefix= --dst-prefix= --no-prefix --src-prefix= --dst-prefix=
--inter-hunk-context= --inter-hunk-context=
--patience --histogram --minimal --patience --histogram --minimal
@ -1197,7 +1201,7 @@ _git_diff ()
} }
__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
" "
_git_difftool () _git_difftool ()
@ -1298,7 +1302,7 @@ _git_gitk ()
} }
__git_match_ctag() { __git_match_ctag() {
awk "/^${1////\\/}/ { print \$1 }" "$2" awk "/^${1//\//\\/}/ { print \$1 }" "$2"
} }
_git_grep () _git_grep ()
@ -1418,7 +1422,7 @@ __git_log_gitk_options="
# Options that go well for log and shortlog (not gitk) # Options that go well for log and shortlog (not gitk)
__git_log_shortlog_options=" __git_log_shortlog_options="
--author= --committer= --grep= --author= --committer= --grep=
--all-match --all-match --invert-grep
" "
__git_log_pretty_formats="oneline short medium full fuller email raw format:" __git_log_pretty_formats="oneline short medium full fuller email raw format:"
@ -1457,6 +1461,7 @@ _git_log ()
--abbrev-commit --abbrev= --abbrev-commit --abbrev=
--relative-date --date= --relative-date --date=
--pretty= --format= --oneline --pretty= --format= --oneline
--show-signature
--cherry-pick --cherry-pick
--graph --graph
--decorate --decorate= --decorate --decorate=
@ -1611,12 +1616,33 @@ _git_pull ()
__git_push_recurse_submodules="check on-demand" __git_push_recurse_submodules="check on-demand"
__git_complete_force_with_lease ()
{
local cur_=$1
case "$cur_" in
--*=)
;;
*:*)
__gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
;;
*)
__gitcomp_nl "$(__git_refs)" "" "$cur_"
;;
esac
}
_git_push () _git_push ()
{ {
case "$prev" in case "$prev" in
--repo) --repo)
__gitcomp_nl "$(__git_remotes)" __gitcomp_nl "$(__git_remotes)"
return return
;;
--recurse-submodules)
__gitcomp "$__git_push_recurse_submodules"
return
;;
esac esac
case "$cur" in case "$cur" in
--repo=*) --repo=*)
@ -1627,11 +1653,16 @@ _git_push ()
__gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}" __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
return return
;; ;;
--force-with-lease=*)
__git_complete_force_with_lease "${cur##--force-with-lease=}"
return
;;
--*) --*)
__gitcomp " __gitcomp "
--all --mirror --tags --dry-run --force --all --mirror --tags --dry-run --force --verbose
--force-with-lease --verbose --receive-pack= --repo= --quiet --prune --delete --follow-tags
--set-upstream --recurse-submodules= --receive-pack= --repo= --set-upstream
--force-with-lease --force-with-lease= --recurse-submodules=
" "
return return
;; ;;
@ -1659,6 +1690,7 @@ _git_rebase ()
--committer-date-is-author-date --ignore-date --committer-date-is-author-date --ignore-date
--ignore-whitespace --whitespace= --ignore-whitespace --whitespace=
--autosquash --fork-point --no-fork-point --autosquash --fork-point --no-fork-point
--autostash
" "
return return
@ -1841,6 +1873,10 @@ _git_config ()
__gitcomp "$__git_send_email_suppresscc_options" __gitcomp "$__git_send_email_suppresscc_options"
return return
;; ;;
sendemail.transferencoding)
__gitcomp "7bit 8bit quoted-printable base64"
return
;;
--get|--get-all|--unset|--unset-all) --get|--get-all|--unset|--unset-all)
__gitcomp_nl "$(__git_config_get_set_variables)" __gitcomp_nl "$(__git_config_get_set_variables)"
return return
@ -1975,6 +2011,7 @@ _git_config ()
color.status.changed color.status.changed
color.status.header color.status.header
color.status.nobranch color.status.nobranch
color.status.unmerged
color.status.untracked color.status.untracked
color.status.updated color.status.updated
color.ui color.ui
@ -2149,6 +2186,7 @@ _git_config ()
pull.octopus pull.octopus
pull.twohead pull.twohead
push.default push.default
push.followTags
rebase.autosquash rebase.autosquash
rebase.stat rebase.stat
receive.autogc receive.autogc
@ -2308,6 +2346,7 @@ _git_show ()
;; ;;
--*) --*)
__gitcomp "--pretty= --format= --abbrev-commit --oneline __gitcomp "--pretty= --format= --abbrev-commit --oneline
--show-signature
$__git_diff_common_options $__git_diff_common_options
" "
return return
@ -2513,6 +2552,16 @@ _git_tag ()
__gitcomp_nl "$(__git_refs)" __gitcomp_nl "$(__git_refs)"
;; ;;
esac esac
case "$cur" in
--*)
__gitcomp "
--list --delete --verify --annotate --message --file
--sign --cleanup --local-user --force --column --sort
--contains --points-at
"
;;
esac
} }
_git_whatchanged () _git_whatchanged ()