This seems to work (see attachment). [DISCLAIMER: I make no claims that this is pretty.] Geert, I think the problem with filename completion when '--usepkg' is specified has to do with the suffix and glob flags when setting $setsma. I made a few other changes and was having the same problem (i.e. after the dirname was completed, it appended a "/" and added a space; interestingly, though, was that when I backspaced, it then completed on filenames properly). To get it working, I removed the '-S' flag and changed the glob pattern to "*/" (only when '--usepkg' is specified, of course). Maybe one of us should mail this addition to the bash_completion maintainer so it can be included in the main package. (He might also be able to clean it up a bit. If you'd like to send it in, feel free to point the finger at me for the hacks. ;-) ) Zach Geert Bevin wrote: > Hi all, > > here is a slightly updated emerge bash completion which also completes > the arguments now and adds 'update' and 'system' to the completions. > > I have one problem though. emerge --usepkg should complete on files. > Normally a command that completes on files is defined with 'complete -f > command'. The bash info says that the 'comspec' builtin which is used to > generate completion matches generates those matches in the same way as > 'complete', however when using 'comspec -f' the filename completion > stops after one path element and doesn't continue until a file has been > reached. Does someone know how to work around this? > > Geert. > > > > ------------------------------------------------------------------------ > > # Gentoo emerge completion. > # > _emerge() > { > local cur prev grepcmd sedcmd systemactions setsma setbig > > COMPREPLY=() > cur=${COMP_WORDS[COMP_CWORD]} > prev=${COMP_WORDS[COMP_CWORD-1]} > > if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then > COMPREPLY=( $( compgen -W '--pretend \ > --autoclean \ > --usepkg \ > --buildpkg' | grep ^$cur ) ) > elif [ "$prev" == "--usepkg" ]; then > COMPREPLY=( $( compgen -f $cur ) ) > else > cd /usr/portage > grepcmd="grep -E ^$cur.*" > sedcmd="sed -e /CVS/d \ > -e /BUGS-TODO/d \ > -e /ChangeLog.*/d \ > -e /header.txt/d \ > -e /skel.build/d \ > -e /distfiles/d \ > -e /eclass/d \ > -e /files/d \ > -e /incoming/d \ > -e /packages/d \ > -e /profiles/d \ > -e /scripts/d" > systemactions=$'\n'"system"$'\n'"upgrade" > setsma="`compgen -S '/' -G "*" | $sedcmd`"$systemactions > setbig="`compgen -G "*/*" | $sedcmd`"$systemactions > if [ $cur ]; then > if [ `echo $cur | grep '/'` ]; then > COMPREPLY=( $( echo "$setbig" | $grepcmd ) ) > else > if [ `echo "$setsma" | $grepcmd | grep '/' | wc -l` = 1 ]; then > COMPREPLY=( $( echo "$setbig" | $grepcmd ) ) > else > COMPREPLY=( $( echo "$setsma" | $grepcmd ) ) > fi > fi > else > COMPREPLY=( $( echo "$setsma" ) ) > fi > fi > > return 0 > } > complete -F _emerge emerge >