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

Re: Adding array content to cd completion



Peter Stephenson <pws@xxxxxxx> wrote:
> Arguably there should be an easier way of saying only use the fake matches.
> I think that's quite difficult since all the normal matches have been added
> and are in the shell's internal structures by the time that style is
> processed.

Not quite true:  we add the normal matches with the options being
specified by _description.  There's a trick we can use: if ignored-patterns
applies to the normal completions, but not to fake completions, we can
completely override normal completions by ignoring them all.  This means
you can add an extra match group anywhere you like by supplementing an
existing tag.

I've added the fake-always style to do this.

Index: Completion/Base/Core/_description
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Base/Core/_description,v
retrieving revision 1.5
diff -u -r1.5 _description
--- Completion/Base/Core/_description	21 Jul 2003 17:01:44 -0000	1.5
+++ Completion/Base/Core/_description	15 Nov 2006 14:51:46 -0000
@@ -58,7 +58,9 @@
 				  "${(@)words[CURRENT+1,-1]}" );;
     esac
 
-  (( $#_comp_ignore )) && opts=( $opts -F _comp_ignore )
+  # Ensure the ignore option is first so we can override it
+  # for fake-always.
+  (( $#_comp_ignore )) && opts=( -F _comp_ignore $opts )
 else
   _comp_ignore=()
 fi
@@ -86,15 +88,21 @@
   fi
 fi
 
-if ! (( ${funcstack[2,-1][(I)_description]} )) &&
-   zstyle -a ":completion:${curcontext}:$tag" fake match; then
-
-  local descr
-
-  descr=( "${(@M)match:#*[^\\]:*}" )
-
-  compadd "${(@P)name}" - "${(@)${(@)match:#*[^\\]:*}:s/\\:/:/}"
-  (( $#descr )) && _describe -t "$tag" '' descr "${(@P)name}"
+if ! (( ${funcstack[2,-1][(I)_description]} )); then
+  local fakestyle descr
+  for fakestyle in fake fake-always; do
+    zstyle -a ":completion:${curcontext}:$tag" $fakestyle match ||
+    continue
+
+    descr=( "${(@M)match:#*[^\\]:*}" )
+
+    opts=("${(@P)name}")
+    if [[ $fakestyle = fake-always && $opts[1,2] = "-F _comp_ignore" ]]; then
+      shift 2 opts
+    fi
+    compadd "${(@)opts}" - "${(@)${(@)match:#*[^\\]:*}:s/\\:/:/}"
+    (( $#descr )) && _describe -t "$tag" '' descr "${(@)opts}"
+  done
 fi
 
 return 0
Index: Doc/Zsh/compsys.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v
retrieving revision 1.194
diff -u -r1.194 compsys.yo
--- Doc/Zsh/compsys.yo	10 Oct 2006 09:37:19 -0000	1.194
+++ Doc/Zsh/compsys.yo	15 Nov 2006 14:51:56 -0000
@@ -1308,6 +1308,31 @@
 fake strings.  Note that the styles tt(fake-files) and tt(fake-parameters)
 provide additional features when completing files or parameters.
 )
+kindex(fake-always, completion style)
+item(tt(fake-always))(
+This works identically to the tt(fake) style except that
+the tt(ignored-patterns) style is not applied to it.  This makes it
+possible to override a set of matches completely by setting the
+ignored patterns to `tt(*)'.
+
+The following shows a way of supplementing any tag with arbitrary data, but
+having it behave for display purposes like a separate tag.  In this example
+we use the features of the tt(tag-order) style to divide the
+tt(named-directories) tag into two when performing completion with
+the standard completer tt(complete) for arguments of tt(cd).  The tag
+tt(named-directories-normal) behaves as normal, but the tag
+tt(named-directories-mine) contains a fixed set of directories.
+This has the effect of adding the match group `tt(extra directories)' with
+the given completions.
+
+example(zstyle ':completion::complete:cd:*' tag-order \ 
+  'named-directories:-mine:extra\ directories
+  named-directories:-normal:named\ directories *'
+zstyle ':completion::complete:cd:*:named-directories-mine' \ 
+  fake-always mydir1 mydir2
+zstyle ':completion::complete:cd:*:named-directories-mine' \ 
+  ignored-patterns '*')
+)
 kindex(fake-files, completion style)
 item(tt(fake-files))(
 This style is used when completing files and looked up 


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


To access the latest news from CSR copy this link into a web browser:  http://www.csr.com/email_sig.php



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