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