Package: bash-completion
Version: 20080705
Severity: normal
Tags: patch

Hi,

find -n[TAB] and find -ne[TAB] won't work, even though other options that is 
not begin with '-n' or '-ne' works correctly.

$ find -n[TAB]
=> -amin       -false      -ilname     -mmin       -print      -user
   -anewer     -fls        -iname      -mount      -print0     -version
   -atime      -follow     -inum       -mtime      -printf     -wholename
   -cmin       -fprint     -ipath      -name       -prune      -xdev
   -cnewer     -fprint0    -iregex     -newer      -regex      -xtype
   -ctime      -fprintf    -links      -nogroup    -size       
   -daystart   -fstype     -lname      -noleaf     -true       
   -depth      -gid        -ls         -nouser     -type       
   -empty      -group      -maxdepth   -ok         -uid        
   -exec       -help       -mindepth   -perm       -used
$ find -ne[TAB]
=> -amin       -false      -ilname     -mmin       -print      -user
   -anewer     -fls        -iname      -mount      -print0     -version
   -atime      -follow     -inum       -mtime      -printf     -wholename
   -cmin       -fprint     -ipath      -name       -prune      -xdev
   -cnewer     -fprint0    -iregex     -newer      -regex      -xtype
   -ctime      -fprintf    -links      -nogroup    -size       
   -daystart   -fstype     -lname      -noleaf     -true       
   -depth      -gid        -ls         -nouser     -type       
   -empty      -group      -maxdepth   -ok         -uid        
   -exec       -help       -mindepth   -perm       -used
$ find -new[TAB]
    => -newer

I expected -n[TAB] completes options that begin with -n, but it completes all 
options...


Besides that, it seems that completions for "-e", "-n", "-ne" or "-en" won't 
work for every program.

$ mplayer -n[TAB]
     => nothing completes
$ mplayer -e[TAB]
     => nothing completes
$ mplayer -ed[TAB]
     => -edl  -edlout

$ convert -e[TAB]
     => nothing completes
$ convert -en[TAB]
     => nothing completes
$ convert -em[TAB]
     => -emboss


IMHO, the problem is that _get_cword is using 'echo' to output a string.
It seems that 'echo' cannot output a string "-n" and "-e" because such strings 
are interpreted as a option for 'echo' itself.
Thus I suggest to use 'printf' instead of 'echo'.

  echo "$var"   =>   printf "%s" "$var"


Regards,

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)

Kernel: Linux 2.6.26-1-686 (SMP w/1 CPU core)
Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages bash-completion depends on:
ii  bash                          3.2-4      The GNU Bourne Again SHell

bash-completion recommends no packages.

bash-completion suggests no packages.

-- no debconf information
--- bash_completion.orig        2008-07-05 22:55:03.000000000 +0900
+++ bash_completion     2008-09-07 15:05:46.000000000 +0900
@@ -228,7 +228,7 @@
 _get_cword()
 {
        if [[ "${#COMP_WORDS[COMP_CWORD]}" -eq 0 ]] || [[ "$COMP_POINT" == 
"${#COMP_LINE}" ]]; then
-               echo "${COMP_WORDS[COMP_CWORD]}"
+               printf "%s" "${COMP_WORDS[COMP_CWORD]}"
        else
                local i
                local cur="$COMP_LINE"
@@ -249,9 +249,9 @@
                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]}"
+                       printf "%s" "${COMP_WORDS[COMP_CWORD]}"
                else
-                       echo "${cur:0:$index}"
+                       printf "%s" "${cur:0:$index}"
                fi
        fi
 }

Reply via email to