Re: [RFC/PATCH] completion: avoid "words" as variable name for zsh portability
- From
Felipe Contreras <felipe.contreras@gmail.com>
- Date
- Apr 28, 2011, 20:24 UTC
- Message-ID
- <BANLkTikt=Em6kP93aZfuZ3DEXdXN+7sAzg@mail.gmail.com>
- In-Reply-To
- <20110428160115.GA19003@goldbirke>
2011/4/28 SZEDER Gábor <szeder@ira.uka.de>:
Show 48 quoted lines
> On Wed, Apr 27, 2011 at 01:40:34AM -0500, Jonathan Nieder wrote:
>> The "_get_comp_words_by_ref -n := words" command from the
>> bash_completion library reassembles a modified version of COMP_WORDS
>> with ':' and '=' no longer treated as word separators and stores it in
>> the ${words[@]} array. Git's programmable tab completion script uses
>> this to abstract away the difference between bash v3's and bash v4's
>> definitions of COMP_WORDS (bash v3 used shell words, while bash v4
>> breaks at separator characters); see v1.7.4-rc0~11^2~2 (bash: get
>> --pretty=m<tab> completion to work with bash v4, 2010-12-02).
>>
>> zsh has (or rather its completion functions have) another idea about
>> what ${words[@]} should contain: the array is prepopulated with the
>> words from the command it is completing. For reasons that are not
>> well understood, when git-completion.bash reserves its own "words"
>> variable with "local words", the variable becomes empty and cannot be
>> changed from then on. So the completion script neglects the arguments
>> it has seen, and words complete like git subcommand names. For
>> example, typing "git log origi<TAB>" gives no completions because
>> there are no "git origi..." commands.
>>
>> Work around this by using a different variable (comp_words) that is
>> not special to zsh. So now commands that completed correctly before
>> v1.7.4-rc0~11^2~2 on zsh should be able to complete correctly again.
>
> Thanks for this explanation. I tried to fix this some time ago, but
> got only as far as to indentify that something is amiss with returning
> $words from _get_comp_words_by_ref(), and during tracing I saw so much
> weird and (for me) unexplicable zsh behavior that I simply gave up.
>
> But this patch heavily conflicted with one of my long-forgotten
> cleanup patch series, and that series together with the above
> explanation gave me alternative ideas for fixing this issue with zsh.
>
> So, here it is. The first two patches are independent cleanups, but
> they make the actual fix in the third patch so short.
>
> It works well as far as I tested it with both bash and zsh, but I
> would really appreciate a few extra sets of eyeballs for the cleanups
> and sanity-checking and testing of the bugfix.
>
>
> SZEDER Gábor (3):
> bash: don't modify the $cur variable in completion functions
> bash: remove unnecessary _get_comp_words_by_ref() invocations
> bash: don't declare 'local words' to make zsh happy
>
> contrib/completion/git-completion.bash | 225 +++++++++-----------------------
> 1 files changed, 64 insertions(+), 161 deletions(-)Nice! Much better approach.
I also noticed that behavior when not defining 'words' as local, but though modifying all those instances was overkill.
Acked-by: Felipe Contreras <felipe.contreras@gmail.com>
-- Felipe Contreras