summary refs log tree commit diff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-10-09 12:56:02 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-10-09 12:56:02 +0000
commit933813e971a4a9d9fd5911226935c9be55a87f13 (patch)
tree9e3fd443c83d35939b3fab0df4f762c4a8c16049
parent2a2de0abeac1ce7295be907bdb13e795d94a67f0 (diff)
downloadzsh-933813e971a4a9d9fd5911226935c9be55a87f13.tar.gz
zsh-933813e971a4a9d9fd5911226935c9be55a87f13.tar.xz
zsh-933813e971a4a9d9fd5911226935c9be55a87f13.zip
change file completion default to offer globbed files and directories on first try (15995)
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Unix/Type/_files40
-rw-r--r--Doc/Zsh/compsys.yo20
3 files changed, 47 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index cc050bccd..2536ad17c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-10-09  Sven Wischnowsky  <wischnow@zsh.org>
+
+	* 15995: Completion/Unix/Type/_files, Doc/Zsh/compsys.yo:
+	change file completion default to offer globbed files and
+	directories on first try
+
 2001-10-09  Peter Stephenson  <pws@csr.com>
 
 	* 15994: Completion/compinstall: handle list-suffixes; make
diff --git a/Completion/Unix/Type/_files b/Completion/Unix/Type/_files
index 87234eb2d..fa98ce574 100644
--- a/Completion/Unix/Type/_files
+++ b/Completion/Unix/Type/_files
@@ -37,12 +37,25 @@ if zstyle -a ":completion:${curcontext}:" file-patterns tmp; then
   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 @@ fi
 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 @@ for def in "$pats[@]"; do
       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
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index d9afe9933..ff41b09b3 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -1111,10 +1111,12 @@ kindex(file-patterns, completion style)
 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 @@ the string on the line, one would do:
 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