Volume XXII, number 279Tuesday, October 6, 2026Latest message 20 minutes ago

The Git List

News and archive of git@vger.kernel.org, since April 2005

patchcompletion: exclude previous file arguments in Zsh

5 messages between Oct 3, 2026 and Oct 5, 2026, from Fionn via GitGitGadget, SZEDER Gábor, Fionn, Junio C Hamano.

Plain Markdown or JSON for tools and agents. Diffs are folded; open one to read it.

Fionn via GitGitGadgetOct 3, 2026, 11:22 UTC on lore
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 Zsh
Published-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
SZEDER GáborOct 4, 2026, 08:07 UTC in reply to Fionn via GitGitGadget on lore

Re: [PATCH] completion: exclude previous file arguments in Zsh

On Sat, Oct 03, 2026 at 11:22:06AM +0000, Fionn via GitGitGadget wrote:
> We can get this with minor changes, however. Here we introduce an array
> __git_file_exclude which we populate with existing arguments and then
"existing arguments" of what?
> tell compadd to exclude them, which closely matches the Zsh _git
> completion behaviour (as well as common programs such as rm).
Show 5 quoted lines
> @@ -284,6 +284,8 @@ __git_zsh_main ()
>  
>  		(( $+opt_args[--help] )) && command='help'
>  
> +		__git_file_exclude=(${words[2,-1]:#${words[CURRENT]}})
I don't do Zsh, but that 2 as index looks suspicious.
What will be excluded in the following command line:
  git -C dir -C subdir -c foo.bar=baz add file1 file2 <TAB>

I think we should exclude only those arguments that come after the git command, in this case after "add", i.e. "file1" and "file2", but I suspect that everything starting with "dir" will get excluded.

> +
>  		words=( ${orig_words[@]} )
>  
>  		__git_zsh_bash_func $command
FionnOct 4, 2026, 16:17 UTC in reply to SZEDER Gábor on lore

Re: [PATCH] completion: exclude previous file arguments in Zsh

> "existing arguments" of what?
Of a subcommand that takes paths.
> I don't do Zsh, but that 2 as index looks suspicious.

Fair to be suspicious. word[1] is the subcommand (e.g. "add"), so we index from 2 on in order to skip it. This is independent of where the subcommand appears in the entire command line.

Show 7 quoted lines
> What will be excluded in the following command line:
>
>   git -C dir -C subdir -c foo.bar=baz add file1 file2 <TAB>
>
> I think we should exclude only those arguments that come after the git
> command, in this case after "add", i.e. "file1" and "file2", but I
> suspect that everything starting with "dir" will get excluded.

In my testing this works correctly (i.e. file1 and file2 are not offered as completion candidates any more, but if e.g. dir or foo exist in the subdirectory, they would be offered).

I've been dogfooding this for about 8 months on and off. Occasionally completion candidates I'd hope would be excluded are present, but this is because the fallback completion bypasses __gitcomp_file, which is a separate issue. I have not yet encountered completion candidates being unexpectedly excluded.

An easy way to test this is to link git-completion.zsh to _git and then add

    fpath=(/path/to/directory/containing/_git/file $fpath[@])
to ~/.zshrc, or similar.
Junio C HamanoOct 4, 2026, 21:13 UTC in reply to SZEDER Gábor on lore

Re: [PATCH] completion: exclude previous file arguments in Zsh

SZEDER Gábor <szeder.dev@gmail.com> writes:
Show 7 quoted lines
> What will be excluded in the following command line:
>
>   git -C dir -C subdir -c foo.bar=baz add file1 file2 <TAB>
>
> I think we should exclude only those arguments that come after the git
> command, in this case after "add", i.e. "file1" and "file2", but I
> suspect that everything starting with "dir" will get excluded.
I was writing the same message when I saw yours.

If you had a file called 'add' in the working tree and then typed "a<TAB>" to complete, is 'add' offered together with other files whose name begins with 'a'?

FionnOct 5, 2026, 01:44 UTC in reply to Junio C Hamano on lore

Re: [PATCH] completion: exclude previous file arguments in Zsh

> If you had a file called 'add' in the working tree and then typed
> "a<TAB>" to complete, is 'add' offered together with other files
> whose name begins with 'a'?
It is indeed.

Back to recent threads