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

[PATCH v5 (for maint)] git-completion: fix regression in zsh support

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
May 10, 2011, 12:20 UTC
Message-ID
<1305030039-16044-1-git-send-email-felipe.contreras@gmail.com>

Right now zsh is quite broken; the completion doesn't notice when there's a subcommand. For example: "git log origi<TAB>" gives no completions because it would try to find a "git origi..." command. The issue would be gone in zsh 4.3.12, but for now we can workaround it by porting the same fix.

The problem started after commit v1.7.4-rc0~11^2~2 (bash: get --pretty=m<tab> completion to work with bash v4), which introduced _get_comp_words_by_ref() that comes from bash-completion[1] scripts, and relies on the 'words' variable. However, it turns out 'words' is a special variable used by zsh completion. From zshcompwid(1):

  [...] the parameters are reset on each function exit (including nested
  function calls from within the completion widget) to the values they
  had when the function was entered.
As a result, subcommand words are lost.

This is now fixed in the latest master branch of zsh[2] by simply defining 'words' as hidden (typeset -h), which removes the special meaning inside the emulated bash function. So let's do the same.

Jonathan Nieder helped on the commit message.

[1] http://bash-completion.alioth.debian.org/ [2] http://zsh.git.sourceforge.net/git/gitweb.cgi?p=zsh/zsh;a=commitdiff;h=e880604f029088f32fb1ecc39213d720ae526aaa

Reported-by: Stefan Haller <lists@haller-berlin.de>
Comments-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
v2: fix _gitk() too as Szeder suggested.
v3: improve commit message as Jonathan Nieder suggested.
    Also, improve comments.
v4: more commit message improvements
v5: even more commit message improvements from Jonathan's version
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 840ae38..a7d20df 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2710,6 +2710,10 @@ _git ()
 	if [[ -n ${ZSH_VERSION-} ]]; then
 		emulate -L bash
 		setopt KSH_TYPESET
+
+		# workaround zsh's bug that leaves 'words' as a special
+		# variable in versions < 4.3.12
+		typeset -h words
 	fi
 
 	local cur words cword
@@ -2761,6 +2765,10 @@ _gitk ()
 	if [[ -n ${ZSH_VERSION-} ]]; then
 		emulate -L bash
 		setopt KSH_TYPESET
+
+		# workaround zsh's bug that leaves 'words' as a special
+		# variable in versions < 4.3.12
+		typeset -h words
 	fi
 
 	__git_has_doubledash && return
-- 
1.7.5.1
Next: Junio C Hamano
Message 1 of 6 in “git-completion: fix regression in zsh support”
  1. git-completion: fix regression in zsh supportFelipe Contreras, May 10, 2011
  2. Junio C HamanoMay 10, 2011
  3. Felipe ContrerasMay 10, 2011
  4. Junio C HamanoMay 10, 2011
  5. Jonathan NiederMay 10, 2011
  6. Jonathan NiederMay 10, 2011

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.