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

_files: -/ causes caller's _alternative to be disregarded



I ran into a problem, and found something that was wrong and fixed it
and that made the problem go away, but I don't fully understand why the
patch does in fact fix the problem.

Here's a minimal example:

[[[
% _g() { _files -/ "$@" }
% _f() { _alternative 'x:x:_g' 'y:y:_hosts' }
% compdef _f f 
% zstyle \* list-dirs-first true 
% f <TAB>
(shows just files, doesn't show hosts)
]]]

Tracing, _files takes this codepath:
.
    37	elif [[ $type = */* ]]; then
    38	  glob="*(-/)"
    ⋮
    66	elif zstyle -t ":completion:${curcontext}:" list-dirs-first; then
    67	  pats=( " *(-/):directories:directory ${${glob:-*}//:/\\:}(#q^-/):globbed-files" '*:all-files' )
                                               ^^^^^^^^^^^^^^^^^^^^
.
and «*(-/)(#q^-/)» is not a valid pattern.

Adding another #q fixes the symptom:

[[[
diff --git Completion/Unix/Type/_files Completion/Unix/Type/_files
index 6987824..2b0c558 100644
--- Completion/Unix/Type/_files
+++ Completion/Unix/Type/_files
@@ -35,7 +35,7 @@ if (( $tmp[(I)-g*] )); then
   [[ "$glob" = (#b)(*\()([^\|\~]##\)) && $match[2] != \#q* ]] &&
       glob="${match[1]}#q${match[2]}"
 elif [[ $type = */* ]]; then
-  glob="*(-/)"
+  glob="*(#q-/)"
 fi
 tmp=$opts[(I)-F]
 if (( tmp )); then
]]]

What I'm not clear about is why the invalid pattern for the
"globbed-files" tag caused the "y:y:_hosts" alternative to be skipped.

Cheers,

Daniel

P.S.  The non-minimal example was «git push <TAB>» not offering remotes.



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