Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Completion/correction and _path_files



On Wed, 21 May 2008 07:34:12 -0700
Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> However, if I start with this:
> 
> schaefer<502> ls Scr/
> No matches for `files' or `corrections'

This has been annoying me for ages, although if I made a list of things
that had been annoying me for ages I'd be so busy I'd never get a chance to
be annoyed by them.

The problem in the cases I've tried is right at the last stage, when
compadd is run to add the matches.  The prefixes are added as "-p Src/ -W
Src/" and compadd doesn't like those because it's more than it's job's
worth to pass anything that doesn't begin with "Scr/".

We can convince it by passing the -U option to compadd, and the following
does the job in this case (thought whether *every* occurrence of compadd
I've given it to needs it beats me---this isn't even the whole list, since
I didn't add it to a number of occurrences of compadd that don't appear to
be there to add file matches).

However, there's a good chance this has got some side effect.  (You might
hope there wasn't, and that _path_files was smart enough only to add things
it already knew matched, so -U was harmless, but things in the underworld
aren't that easy, and I have a vague feeling I already tried this and found
a problem once.)  If we can find out what that is we might be able to work
around it, and if it doesn't affect approximation we can make the -U only
apply then (I haven't done that here because that would mask any side
effects that I want to tease out).  I will try it for a bit and see what
happens.

I've already noticed this doesn't play well with partial path completion,
though that appears to be separate problem.  Hence Sec/Zie/zle_main<TAB>
completes properly, but S/Zie/zle_main<TAB> gives you options for S without
properly matching the rest.  You have to stop and restart the completion
when it offers you Src.

Index: Completion/Unix/Type/_path_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v
retrieving revision 1.28
diff -u -r1.28 _path_files
--- Completion/Unix/Type/_path_files	18 May 2008 20:51:48 -0000	1.28
+++ Completion/Unix/Type/_path_files	2 Jun 2008 16:32:27 -0000
@@ -595,7 +595,7 @@
 	    # back up the path.
 	    tmp1=("${(@)tmp1%%/*}")
 	    _list_files tmp1 "$prepath$realpath$testpath"
-	    compadd -Qf "$mopts[@]" -p "$linepath$tmp2" -s "/${tmp3#*/}" \
+	    compadd -U -Qf "$mopts[@]" -p "$linepath$tmp2" -s "/${tmp3#*/}" \
 	            -W "$prepath$realpath$testpath" \
 		    "$pfxsfx[@]" -M "r:|/=* r:|=*" \
 		    $listopts \
@@ -604,7 +604,7 @@
 	    # Same with a non-empty suffix
 	    tmp1=("${(@)^tmp1%%/*}/${tmp3#*/}")
 	    _list_files tmp1 "$prepath$realpath$testpath"
-	    compadd -Qf "$mopts[@]" -p "$linepath$tmp2" \
+	    compadd -U -Qf "$mopts[@]" -p "$linepath$tmp2" \
 	            -W "$prepath$realpath$testpath" \
 		    "$pfxsfx[@]" -M "r:|/=* r:|=*" \
 	            $listopts \
@@ -612,7 +612,7 @@
           fi
 	else
 	  _list_files tmp1 "$prepath$realpath$testpath"
-	  compadd -Qf "$mopts[@]" -p "$linepath$tmp2" \
+	  compadd -U -Qf "$mopts[@]" -p "$linepath$tmp2" \
 	          -W "$prepath$realpath$testpath" \
 		   "$pfxsfx[@]" -M "r:|/=* r:|=*" \
 	           $listopts \
@@ -621,7 +621,7 @@
       else
 	# We are inserting the match into the command line.
         if [[ "$tmp3" = */* ]]; then
-	  tmp4=( -Qf "$mopts[@]" -p "$linepath$tmp2"
+	  tmp4=( -U -Qf "$mopts[@]" -p "$linepath$tmp2"
 	         -W "$prepath$realpath$testpath"
 	         "$pfxsfx[@]" -M "r:|/=* r:|=*" )
 	  if [[ -z "$listsfx" ]]; then
@@ -640,7 +640,7 @@
           fi
         else
 	  _list_files tmp1 "$prepath$realpath$testpath"
-	  compadd -Qf "$mopts[@]" -p "$linepath$tmp2" \
+	  compadd -U -Qf "$mopts[@]" -p "$linepath$tmp2" \
                   -W "$prepath$realpath$testpath" \
 		  "$pfxsfx[@]" -M "r:|/=* r:|=*" \
                   $listopts \
@@ -708,7 +708,7 @@
       compquote tmp4 tmp2 tmp1
       for i in "$tmp1[@]"; do
 	_list_files tmp2 "$prepath$realpath${mid%/*/}"
-        compadd -Qf "$mopts[@]" -p "$linepath$tmp3/" -s "/$tmp4$i" \
+        compadd -U -Qf "$mopts[@]" -p "$linepath$tmp3/" -s "/$tmp4$i" \
                 -W "$prepath$realpath${mid%/*/}/" \
 	        "$pfxsfx[@]" -M "r:|/=* r:|=*" $listopts - "$tmp2"
       done
@@ -733,12 +733,12 @@
             "${PREFIX#\~}$SUFFIX" = (|*[^\\])[][*?#~^\|\<\>]* ]]; then
 	tmp1=("$linepath$tmp4${(@)^tmp1}")
 	_list_files tmp1 "$prepath$realpath"
-        compadd -Qf -W "$prepath$realpath" "$pfxsfx[@]" "$mopts[@]" \
+        compadd -U -Qf -W "$prepath$realpath" "$pfxsfx[@]" "$mopts[@]" \
                 -M "r:|/=* r:|=*" $listopts -a tmp1
       else
 	# Not a pattern match
 	_list_files tmp1 "$prepath$realpath$testpath"
-        compadd -Qf -p "$linepath$tmp4" -W "$prepath$realpath$testpath" \
+        compadd -U -Qf -p "$linepath$tmp4" -W "$prepath$realpath$testpath" \
 	        "$pfxsfx[@]" "$mopts[@]" -M "r:|/=* r:|=*" $listopts -a tmp1
       fi
     fi




-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070



Messages sorted by: Reverse Date, Date, Thread, Author