git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 2/4] completion: introduce __gitcomp_nl_append ()

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 3, 2014, 20:41 UTC
Message-ID
<xmqq38l4n6h9.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1388779022-14536-3-git-send-email-artagnon@gmail.com>
Ramkumar Ramachandra <artagnon@gmail.com> writes:
Show 20 quoted lines
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 51c2dd4..bf358d6 100644
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -233,6 +233,19 @@ __gitcomp_nl ()
>  	__gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
>  }
>  
> +# Variation of __gitcomp_nl () that appends to the existing list of
> +# completion candidates, COMPREPLY.
> +__gitcomp_nl_append ()
> +{
> +	local IFS=$'\n'
> +	local i=${#COMPREPLY[@]}
> +	for x in $1; do
> +		if [[ "$x" == "$3"* ]]; then
> +			COMPREPLY[i++]="$2$x$4"
> +		fi
> +	done
> +}
Hmph. Why so much duplication with __gitcompadd, though.

I would have expected that this "append" behaviour to be done at the lower level by introducing __gitcompappend that does not forcibly truncate by starting from a hard-coded i=0, i.e. a collection of small helper functions plus a single implementation of the logic to push elements into COMPREPLY[] in __gitcompappend, perhaps like these:

	__gitcompappend () {
		local i=${#COMPREPLY[@]}
		for x in $1; do
                        if [[ "$x" == "$3"* ]]; then
                                COMPREPLY[i++]="$2$x$4"
                        fi
		done
        }
	__gitcompadd () {
		COMPREPLY=()
		__gitcompappend "$@"
	}
	__gitcomp_nl_append () {
		local IFS=$'\n'
                __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
        }
	__gitcomp_nl () {
		COMPREPLY=()
                __gitcomp_nl_append "$@"		
        }
        
Is it because going this route and doing it at such a low level
would make zsh completion (which I have no clue about ;-)
unnecessarily complex?
Show 23 quoted lines
> +
>  # Generates completion reply with compgen from newline-separated possible
>  # completion filenames.
>  # It accepts 1 to 3 arguments:
> diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh
> index 6fca145..6b77968 100644
> --- a/contrib/completion/git-completion.zsh
> +++ b/contrib/completion/git-completion.zsh
> @@ -76,6 +76,14 @@ __gitcomp_nl ()
>  	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
>  }
>  
> +__gitcomp_nl_append ()
> +{
> +	emulate -L zsh
> +
> +	local IFS=$'\n'
> +	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
> +}
> +
>  __gitcomp_file ()
>  {
>  	emulate -L zsh
Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 4 of 8 in “Fix branch.autosetup(merge|rebase) completion”
  1. 0/4 Fix branch.autosetup(merge|rebase) completionRamkumar Ramachandra, Jan 3, 2014
  2. 1/4 completion: prioritize ./git-completion.bashRamkumar Ramachandra, Jan 3, 2014
  3. 2/4 completion: introduce __gitcomp_nl_append ()Ramkumar Ramachandra, Jan 3, 2014
  4. Junio C HamanoJan 3, 2014
  5. Ramkumar RamachandraJan 5, 2014
  6. 3/4 completion: fix branch.autosetup(merge|rebase)Ramkumar Ramachandra, Jan 3, 2014
  7. 4/4 completion: fix remote.pushdefaultRamkumar Ramachandra, Jan 3, 2014
  8. Junio C HamanoJan 3, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.