[Bash-completion-commits] ./current r1129: fixed _get_cword()

David Paleino d.paleino at gmail.com
Mon Jun 23 09:09:32 UTC 2008


------------------------------------------------------------
revno: 1129
committer: David Paleino <d.paleino at gmail.com>
branch nick: current
timestamp: Mon 2008-06-23 11:09:32 +0200
message:
  fixed _get_cword()
modified:
  bash_completion
  debian/changelog
-------------- next part --------------
=== modified file 'bash_completion'
--- a/bash_completion	2008-06-23 09:03:01 +0000
+++ b/bash_completion	2008-06-23 09:09:32 +0000
@@ -221,29 +221,33 @@
 # for things like scp where we want to return host:path and not only path.
 _get_cword()
 {
-	local i
-	local LC_CTYPE=C
-	local WORDBREAKS=${COMP_WORDBREAKS}
-	if [ -n $1 ]; then
-		for (( i=0; i<${#1}; ++i )); do
-			local char=${1:$i:1}
-			WORDBREAKS=${WORDBREAKS//$char/}
+	if [[ "${#COMP_WORDS[COMP_CWORD]}" -eq 0 ]] || [[ "$COMP_POINT" == "${#COMP_LINE}" ]]; then
+		echo "${COMP_WORDS[COMP_CWORD]}"
+	else
+		local i
+		local cur="$COMP_LINE"
+		local index="$COMP_POINT"
+		for (( i = 0; i <= COMP_CWORD; ++i )); do
+			while [[ "${#cur}" -ge ${#COMP_WORDS[i}} ]] && [[ "${cur:0:${#COMP_WORDS[i]}}" != "${COMP_WORDS{i]}" ]]; do
+				cur="${cur:1}"
+				index="$(( index - 1 ))"
+			done
+			if [[ "$i" -lt "$COMP_CWORD" ]]; then
+				local old_size="${#cur}"
+				cur="${cur#${COMP_WORDS[i]}}"
+				local new_size="${#cur}"
+				index="$(( index - old_size + new_size ))"
+			fi
 		done
+		
+		if [[ "${COMP_WORDS[COMP_CWORD]:0:${#cur}}" != "$cur" ]]; then
+			# We messed up! At least return the whole word so things 
+			# keep working
+			echo "${COMP_WORDS[COMP_CWORD]}"
+		else
+			echo "${cur:0:$index}"
+		fi
 	fi
-	local cur=${COMP_LINE:0:$COMP_POINT}
-	local tmp="${cur}"
-	local word_start=`expr "$tmp" : '.*['"${WORDBREAKS}"']'`
-	while [ "$word_start" -ge 2 ]; do
-		local char=${cur:$(( $word_start - 2 )):1}
-		if [ "$char" != "\\" ]; then
-			break
-		fi
-		tmp=${COMP_LINE:0:$(( $word_start - 2 ))}
-		word_start=`expr "$tmp" : '.*['"${WORDBREAKS}"']'`
-	done
-
-	cur=${cur:$word_start}
-	echo "$cur"
 }
 
 # This function performs file and directory completion. It's better than

=== modified file 'debian/changelog'
--- a/debian/changelog	2008-06-23 09:03:01 +0000
+++ b/debian/changelog	2008-06-23 09:09:32 +0000
@@ -2,8 +2,9 @@
 
   * Merged Ubuntu changes:
     - added quote(), quote_readline(), dequote() helper functions.
+    - fixed _get_cword()
 
- -- David Paleino <d.paleino at gmail.com>  Mon, 23 Jun 2008 11:00:04 +0200
+ -- David Paleino <d.paleino at gmail.com>  Mon, 23 Jun 2008 11:09:09 +0200
 
 bash-completion (20080617.3) unstable; urgency=low
 



More information about the Bash-completion-commits mailing list