From 2f29988f11a818f14c94bbef5339ceaac24131f7 Mon Sep 17 00:00:00 2001 From: Fionn Fitzmaurice Date: Wed, 25 Feb 2026 23:05:44 +0800 Subject: [PATCH] completion: exclude previous file arguments in Zsh 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 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 --- contrib/completion/git-completion.zsh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh index c32186a977e2d1..042199f0d9e779 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 () @@ -261,6 +261,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 @@ -273,6 +275,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]}