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

[RFC/PATCH 2/1] bash: eliminate dependency on bash_completion lib

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Dec 2, 2010, 21:02 UTC
Message-ID
<20101202210207.GA4994@burratino>
In-Reply-To
<20101202091613.6ac8f816@MonteCarlo.grandprix.int>

Add a minimal implementation of _get_comp_words_by_ref, the routine used to work around bash 4.0's COMP_WORDS semantics.

Based on bash-completion 2.x (commit bf763033, 2010-10-26) but tweaked for simplicity and to allow zsh to at least parse the code.

Based-on-patch-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Peter van der Does wrote:
> Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 13 quoted lines
>>  2. Import the definition of _get_comp_words_by_ref from the
>>     bash-completion lib and use it if ZSH_VERSION is unset.
>> 
>>  3. Further refinements, if needed.
>> 
>> What do you think?
>
> I like the idea and we should go with this solution.
> 
> If by importing you mean using :
> [CODE]. /git_bash_completion-functions[/CODE] in the
> contrib/completion/git-completion.bash script, which would be the best
> solution imho. The question is where to place that the function file.
[...]
> It would have to include copying the functions file somewhere as well.
> 
> Or we could use the method used now and include the functions in the
> git-completion.bash script.
Sorry for the lack of clarity.  Here's what I meant.
 contrib/completion/git-completion.bash |  125 ++++++++++++++++++++++++++++++++
 1 files changed, 125 insertions(+), 0 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 0b0eb45..1743319 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -327,7 +327,102 @@ __gitcomp_1 ()
 	done
 }
 
+# The following function is based on code from:
+#
+#   bash_completion - programmable completion functions for bash 3.2+
+#
+#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
+#             © 2009-2010, Bash Completion Maintainers
+#                     <bash-completion-devel@lists.alioth.debian.org>
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2, or (at your option)
+#   any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#   The latest version of this software can be obtained here:
+#
+#   http://bash-completion.alioth.debian.org/
+#
+#   RELEASE: 2.x
+
+# This function can be used to access a tokenized list of words
+# on the command line:
+#
+#	__reassemble_comp_words_by_ref '=:'
+#	if test "${words_[cword_-1]}" = -w
+#	then
+#		...
+#	fi
+#
+# The argument should be a collection of characters from the list of
+# word completion separators (COMP_WORDBREAKS) to treat as ordinary
+# characters.
+#
+# This is roughly equivalent to locally setting COMP_WORDBREAKS to
+# exclude those characters, but it does not clobber COMP_WORDBREAKS.
+# The intent is for it to be used by commands like ssh that want to
+# treat host:path as one token.
+#
+# Output: words_, cword_, cur_.
+
+__git_reassemble_comp_words_by_ref()
+{
+	local exclude i j first
+	# Which word separators to exclude?
+	exclude="${1//[^$COMP_WORDBREAKS]}"
+	cword_=$COMP_CWORD
+	if [ -z "$exclude" ]; then
+		words_=("${COMP_WORDS[@]}")
+		return
+	fi
+	# List of word completion separators has shrunk;
+	# re-assemble words to complete.
+	for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
+		# Append each nonempty word consisting of just
+		# word separator characters to the current word.
+		first=t
+		while
+			[ $i -gt 0 ] &&
+			[ -n "${COMP_WORDS[$i]}" ] &&
+			# word consists of excluded word separators
+			[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
+		do
+			# Attach to the previous token,
+			# unless the previous token is the command name.
+			if [ $j -ge 2 ] && [ -n "$first" ]; then
+				((j--))
+			fi
+			first=
+			words_[$j]=${words_[j]}${COMP_WORDS[i]}
+			if [ $i = $COMP_CWORD ]; then
+				cword_=$j
+			fi
+			if (($i < ${#COMP_WORDS[@]} - 1)); then
+				((i++))
+			else
+				# Done.
+				return
+			fi
+		done
+		words_[$j]=${words_[j]}${COMP_WORDS[i]}
+		if [ $i = $COMP_CWORD ]; then
+			cword_=$j
+		fi
+	done
+}
+
 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
+if [[ -n $ZSH_VERSION ]]; then
 _get_comp_words_by_ref ()
 {
 	while [ $# -gt 0 ]; do
@@ -352,6 +447,36 @@ _get_comp_words_by_ref ()
 		shift
 	done
 }
+else
+_get_comp_words_by_ref ()
+{
+	local exclude cur_ cword_
+	local words_=()
+	if [ "$1" = "-n" ]; then
+		exclude=$2
+		shift 2
+	fi
+	__git_reassemble_comp_words_by_ref "$exclude"
+	cur_=${words_[cword_]}
+	while [ $# -gt 0 ]; do
+		case "$1" in
+		cur)
+			cur=$cur_
+			;;
+		prev)
+			prev=${words_[$cword_-1]}
+			;;
+		words)
+			words=("${words_[@]}")
+			;;
+		cword)
+			cword=$cword_
+			;;
+		esac
+		shift
+	done
+}
+fi
 fi
 
 # __gitcomp accepts 1, 2, 3, or 4 arguments
-- 
1.7.2.3
Previous: Peter van der DoesNext: SZEDER Gábor
Message 10 of 22 in “*** SUBJECT HERE ***”
  1. 0/2 *** SUBJECT HERE ***Peter van der Does, Dec 1, 2010
  2. 1/2 Introduce functions from bash-completion project.Peter van der Does, Dec 1, 2010
  3. 2/2 Use the new functions to get the current cword.Peter van der Does, Dec 1, 2010
  4. Jonathan NiederDec 2, 2010
  5. SZEDER GáborDec 2, 2010
  6. Jonathan NiederDec 1, 2010
  7. SZEDER GáborDec 2, 2010
  8. Jonathan NiederDec 2, 2010
  9. Peter van der DoesDec 2, 2010
  10. 2/1 bash: eliminate dependency on bash_completion libJonathan Nieder, Dec 2, 2010
  11. SZEDER GáborDec 2, 2010
  12. Jonathan NiederDec 3, 2010
  13. Stephen BoydDec 3, 2010
  14. SZEDER GáborDec 7, 2010
  15. Jonathan NiederDec 7, 2010
  16. SZEDER GáborDec 7, 2010
  17. Jonathan NiederDec 7, 2010
  18. Junio C HamanoDec 7, 2010
  19. 0/3 Make git-completion Bash 4 compatibleJonathan Nieder, Dec 15, 2010
  20. 1/3 bash: get --pretty=m<tab> completion to work with bash v4Jonathan Nieder, Dec 15, 2010
  21. 2/3 bash: simple reimplementation of _get_comp_words_by_refJonathan Nieder, Dec 15, 2010
  22. 3/3 Merge branch 'master' (early part) into pd/bash-4-completionJonathan Nieder, Dec 15, 2010

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.