about summary refs log tree commit diff
path: root/Completion/Unix
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2008-05-18 20:51:47 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2008-05-18 20:51:47 +0000
commit7eed3e6d5dd9d1c07be0f6069728e21381718599 (patch)
tree907d16824951746380ed7e8ce5a1aec8055ad07a /Completion/Unix
parent93fa3796c230d6344547729bdcecc72e90bf1b6d (diff)
downloadzsh-7eed3e6d5dd9d1c07be0f6069728e21381718599.tar.gz
zsh-7eed3e6d5dd9d1c07be0f6069728e21381718599.tar.xz
zsh-7eed3e6d5dd9d1c07be0f6069728e21381718599.zip
users/12858: add accept-exact-dirs style
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Type/_path_files23
1 files changed, 23 insertions, 0 deletions
diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index e75e81efd..fc0789f01 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -318,6 +318,29 @@ for prepath in "$prepaths[@]"; do
 
   skipped=
   cpre=
+
+  if zstyle -t ":completion:${curcontext}:paths" accept-exact-dirs &&
+    [[ $pre = (#b)(*)/([^/]#) ]]; then
+    # We've been told that we can accept an exact directory
+    # prefix immediately.  Try this with the longest path prefix
+    # first:  this saves stats in the simple case and may get around
+    # automount behaviour if early components don't yet exist.
+    tmp1=$match[1]
+    tpre=$match[2]
+    while true; do
+      if [[ -d $donepath$tmp1 ]]; then
+	donepath=$donepath$tmp1/
+	pre=$tpre
+	break
+      elif [[ $tmp1 = (#b)(*)/([^/]#) ]]; then
+	tmp1=$match[1]
+	tpre=$match[2]/$tpre
+      else
+	break
+      fi
+    done
+  fi
+
   tpre="$pre"
   tsuf="$suf"
   testpath="$donepath"