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

Re: [PATCH] git-completion: workaround zsh COMPREPLY bug

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Jan 25, 2012, 12:16 UTC
Message-ID
<CAMP44s16L0GJUh4JcQgjBXUf4ftT7yQFgPy0p6zCNMnZjZGQww@mail.gmail.com>
In-Reply-To
<vpqwr8g8c03.fsf@bauges.imag.fr>

On Wed, Jan 25, 2012 at 9:41 AM, Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> wrote:

Show 17 quoted lines
> Felipe Contreras <felipe.contreras@gmail.com> writes:
>
>> The simplest and most generic solution is to hide all the changes we do
>> to IFS, so that "foo \nbar " is recognized by zsh as "foo bar". This
>> works on versions of git before and after the introduction of
>> __gitcomp_nl (a31e626), and versions of zsh before and after 4.3.12.
> [...]
>> +
>> +             # another workaround for zsh because it would quote spaces in
>> +             # the COMPREPLY array if IFS doesn't contain spaces
>> +             typeset -h IFS
>
> No time to test right now, but is this not going to
>
> 1) leave IFS as hidden even outside the completion script, possibly
> affecting unrelated scripts that would need to set IFS as local and keep
> its special effect?
What special effect?
Unrelated scripts can still set IFS as local.
You can test this:

--- #!/bin/sh

if [[ -n ${ZSH_VERSION-} ]]; then
    autoload -U +X bashcompinit && bashcompinit
fi
_foo()
{
    typeset -h IFS
    local cur="${COMP_WORDS[COMP_CWORD]}"
    local IFS=$'\n'
    w[0]='first '
    w[1]='second and space '
    w[2]='third\\ quoted\\ space '
    ./test1 >> /tmp/t1.txt
    COMPREPLY=( $(compgen -W "${w[*]}" -- $cur) )
}
complete -o nospace -F _foo foo
---

test1: --- #!/bin/sh

test1() {
	local IFS=$'\n'
	w=( $(echo -e "foo \nbar"))
	echo "test1: 0:'${w[0]}' 1:'${w[1]}'"
}
test1

w=( $(echo -e "foo \nbar")) echo "test2: 0:'${w[0]}' 1:'${w[1]}'" ---

The result in /tmp/t1.txt would be: test1: 0:'foo ' 1:'bar' test2: 0:'foo' 1:'bar'

Regardless of whether you use typeset -h or not.
> 2) break cases where strings are to be split on \n only (e.g. see
> "foo bar\nboz" as three possible completions "foo", "bar", "boz" instead
> of "foo bar" and "boz"?

Those cases are already broken, which is what I reported to the zsh mailing list. You would get "foo\ bar" and "boz", and that's after 4.3.12; before, compgen -W would still break the completions in 3, because they did 'results+=( $words )', instead of 'results+=( "$words" )'.

Cheers.
-- 
Felipe Contreras
Previous: Matthieu MoyNext: Matthieu Moy
Message 3 of 7 in “git-completion: workaround zsh COMPREPLY bug”
  1. git-completion: workaround zsh COMPREPLY bugFelipe Contreras, Jan 25, 2012
  2. Matthieu MoyJan 25, 2012
  3. Felipe ContrerasJan 25, 2012
  4. Matthieu MoyJan 25, 2012
  5. Felipe ContrerasJan 28, 2012
  6. Junio C HamanoJan 26, 2012
  7. Felipe ContrerasJan 27, 2012

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.