Re: [PATCH for maint] git-completion: fix zsh support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@xxxxxxxxx> writes:

>> Maybe simplest would be to use Szeder's fix + make the zsh version of
>> _get_comp_words_by_ref not overwrite "words" at all?
>
> I do not use zsh myself, but it appears to me that these three-patch
> series can graduate and if real zsh users find problems after using it
> they can be fixed independenty in-tree.
>
> Would that risk too many patch ping-pong among zsh users on 'master'?
> The "don't declare 'local words' in zsh" patch seems to be the right
> work-around for the peculiar semantics of "words" array, at least to me.

GÃbor's patches already work.  I don't think they will cause breakage
or patch ping-pong.

I was trying to imagine Felipe's objection and all I could think of
was that it is not so appealing that _get_comp_words_by_ref is not
actually writing to "words".  For example, the following on top of
sg/completion-updates (= 3bee6a4) will print a greeting and the words
being completed when you press tab, rather than <foo> <bar> <baz>:

-- >8 --
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -469,7 +469,8 @@ _get_comp_words_by_ref ()
 			prev=${COMP_WORDS[COMP_CWORD-1]}
 			;;
 		words)
-			words=("${COMP_WORDS[@]}")
+			words=(foo bar baz)
+			echo >&2 Greetings
 			;;
 		cword)
 			cword=$COMP_CWORD
@@ -2614,6 +2615,9 @@ _git ()
 
 	local cur cword prev
 	_get_comp_words_by_ref -n =: cur words cword prev
+
+	printf >&2 "WORDS: <%s>\n" "${words[@]}"
+
 	while [ $c -lt $cword ]; do
 		i="${words[c]}"
 		case "$i" in
-- 8< --

In practice it works great since "words" already has the right
content, but maybe the "typeset -h" suggestion was motivated by a
desire to have something easier to explain.

I don't think that's a very strong reason to prevent the fix from
graduating, though I suppose I would be happy to see something like
the following on top at some point.

-- 8< --
Subject: completion: do not pretend to assign to special variable $words on zsh

The special variable $words already has essentially the same meaning
as bash's COMP_WORDS on zsh.  While assigning one to the other appears
to work okay, as a no-op, that is actually an illusion --- the value
of $words can be changed in the _get_comp_words_by_ref function where
it is assigned, but after that function returns, $words is back to
normal.

Guard against future breakage by adding a comment mentioning this and
removing the redundant assignment.

Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx>
---
 contrib/completion/git-completion.bash |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 10c1b83..8dfd97f 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -469,7 +469,10 @@ _get_comp_words_by_ref ()
 			prev=${COMP_WORDS[COMP_CWORD-1]}
 			;;
 		words)
-			words=("${COMP_WORDS[@]}")
+			# Nothing to do --- zsh's $words already contains
+			# the list of words being completed (and if we
+			# try to assign to it, the value wouldn't propagate
+			# from this function anyway).
 			;;
 		cword)
 			cword=$COMP_CWORD
-- 
1.7.5.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]