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

Re: path completion and directories



Peter Stephenson wrote:

> ...
> 
> I tend to think mixing in directories should be the default.  It can be a
> little confusing otherwise if you aren't familiar with the system.

Ok, then, here's the patch.

> By the way, you do know about the _next_tags widget?  If you bind it, you
> can use that key for swapping between files and directories.  I don't know
> if it will still allow you switch to globbed files, then directories if the
> default changes, but that would be useful.

This is easy to achieve, so easy that I've prepared it in the patch
(see the lines starting with `###'). This is still commented out
because I'm not sure about the order in which pattern (-combinations)
should be tried.

The two things that look sensible to me are:

  globbed and dirs
  all
  only globbed
  only dirs

Or maybe:

  globbed and dirs
  only globbed
  only dirs
  all

So which order do you prefer? (Not only Peter is asked and not only
the two versions above are on offer, of course.)


Bye
  Sven

Index: Completion/Unix/Type/_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_files,v
retrieving revision 1.4
diff -u -r1.4 _files
--- Completion/Unix/Type/_files	2001/07/13 08:09:52	1.4
+++ Completion/Unix/Type/_files	2001/10/09 12:41:30
@@ -37,12 +37,25 @@
   done
 else
   if [[ "$type" = *g* ]]; then
-    if [[ "$type" = */* ]]; then
-      pats=( " ${glob//:/\\:}:globbed-files *(-/):directories" '*:all-files ' )
-    else
-      pats=( " ${glob//:/\\:}:globbed-files "
-             '*(-/):directories ' '*:all-files ' )
-    fi
+
+  # People prefer to have directories shown on first try as default.
+  # Even if the calling function didn't use -/.
+  #
+  # if [[ "$type" = */* ]]; then
+
+    pats=( " ${glob//:/\\:}:globbed-files *(-/):directories" '*:all-files '
+
+    ### We could allow _next_tags to offer only globbed-files or directories
+    ### by adding:
+    ###   " ${glob//:/\\:}:only-globbed-files " ' *(-/):only-directories '
+
+      )
+
+  # else
+  #   pats=( " ${glob//:/\\:}:globbed-files "
+  #          '*(-/):directories ' '*:all-files ' )
+  # fi
+
   elif [[ "$type" = */* ]]; then
     pats=( '*(-/):directories ' '*:all-files ' )
   else
@@ -53,15 +66,16 @@
 tried=()
 for def in "$pats[@]"; do
   eval "def=( ${${def:gs/\\:/\\\\\\\\\\\\:}//(#b)([][()|*?^#~<>])/\\${match[1]}} )"
+
+  tmp="${(@M)def#*[^\\]:}"
+  (( $tried[(I)${(q)tmp}] )) && continue
+  tried=( "$tried[@]" "$tmp" )
+
   for sdef in "$def[@]"; do
 
     tag="${${sdef#*[^\\]:}%%:*}"
     pat="${${sdef%%:${tag}*}//\\:/:}"
 
-    (( $tried[(I)${(q)pat}] )) && continue
-
-    tried=( "$tried[@]" "$pat" )
-
     if [[ "$sdef" = *:${tag}:* ]]; then
       descr="${(Q)sdef#*:${tag}:}"
     else
@@ -86,7 +100,13 @@
       done
       (( ret )) || break
     done
+
+    ### For that _next_tags change mentioned above we would have to
+    ### comment out the following line. (Or not, depending on the order
+    ### of the patterns.)
+
     [[ "$pat" = '*' ]] && return ret
+
   done
   (( ret )) || return 0
 done
Index: Doc/Zsh/compsys.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v
retrieving revision 1.135
diff -u -r1.135 compsys.yo
--- Doc/Zsh/compsys.yo	2001/10/05 11:18:37	1.135
+++ Doc/Zsh/compsys.yo	2001/10/09 12:41:31
@@ -1111,10 +1111,12 @@
 item(tt(file-patterns))(
 In most places where filenames are completed, the function tt(_files)
 is used which can be configured with this style.  If the style is
-unset, tt(_files) offers, one after another, up to three tags:
+unset, tt(_files) offers, up to three tags:
 `tt(globbed-files)',
 `tt(directories)' and `tt(all-files)', depending on the types of files
-expected by the caller of tt(_files).
+expected by the caller of tt(_files).  The first two
+(`tt(globbed-files)' and `tt(directories)') are normally offered
+together to make it easier to complete files in sub-directories.
 
 If the tt(file-patterns) style is set, the default tags are not
 used.  Instead, the value of the style says which tags and which
@@ -1149,15 +1151,15 @@
 example(zstyle ':completion:*:*:rm:*' file-patterns \ 
     '*.o:object-files' '%p:all-files')
 
-Another interesting example is to change the default behaviour that
-makes completion first offer files matching the patterns given by the
-calling function, then directories and then all files.  Many people 
-prefer to get both the files matching the given patterns and the
-directories in the first try and all files at the second try.  To
-achieve this, one could do:
+Another interesting example is to change the default behaviour in a
+way that makes completion first offer files matching the patterns
+given by the calling function, then directories and then all files. 
+Some people prefer this over getting both the files matching the given
+patterns and the directories in the first try and all files at the
+second try.  To achieve this, one could do:
 
 example(zstyle ':completion:*' file-patterns \ 
-    '%p:globbed-files *(-/):directories' '*:all-files')
+    '%p:globbed-files' '*(-/):directories' '*:all-files')
 
 This works even for contexts in which all files would be completed,
 because tt(_files) will not try a pattern more than once and it stops

-- 
Sven Wischnowsky                    wischnow@xxxxxxxxxxxxxxxxxxxxxxx



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