From: Fionn Fitzmaurice <git@fionn.email>
When using the _git completion function bundled with Zsh (https://sf.net/p/zsh/code/ci/master/tree/Completion/Unix/Command/_git), duplicate files in an argument list will not be offered as completion candidates.
For example, suppose we have untracked files aa and ab (only). Then with the Zsh completion,
git add aa a<tab>
would not offer both aa and ab as completion candidates, rather it would complete ab only.
This behaviour is not present in git-completion.zsh shipped with Git, which does not deduplicate arguments.
We can get this with minor changes, however. Here we introduce an array __git_file_exclude which we populate with existing arguments and then tell compadd to exclude them, which closely matches the Zsh _git completion behaviour (as well as common programs such as rm).
Signed-off-by: Fionn Fitzmaurice <git@fionn.email>
---
completion: exclude previous file arguments in ZshPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2216%2Ffionn%2Fzsh-completion-exclude-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2216/fionn/zsh-completion-exclude-v1 Pull-Request: https://github.com/git/git/pull/2216
contrib/completion/git-completion.zsh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
Show changes to contrib/completion/git-completion.zsh +4 −1
diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh index d5c526665b..26444923c1 100644 --- a/contrib/completion/git-completion.zsh +++ b/contrib/completion/git-completion.zsh @@ -117,7 +117,7 @@ __gitcomp_file () emulate -L zsh compset -P '*[=:]' - compadd -f -p "${2-}" -- ${(f)1} && _ret=0 + compadd -f -p "${2-}" -F __git_file_exclude -- ${(f)1} && _ret=0 } __gitcomp_direct_append () @@ -284,6 +284,8 @@ __git_zsh_main () (( $+opt_args[--help] )) && command='help' + __git_file_exclude=(${words[2,-1]:#${words[CURRENT]}}) + words=( ${orig_words[@]} ) __git_zsh_bash_func $command @@ -296,6 +298,7 @@ _git () local _ret=1 local cur cword prev local __git_repo_path + local -a __git_file_exclude cur=${words[CURRENT]} prev=${words[CURRENT-1]} base-commit: c46c1e37724f0478939de636ab8ea5a89086d532
-- gitgitgadget