summary refs log tree commit diff
path: root/Completion/Builtins/_cd
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Builtins/_cd')
-rw-r--r--Completion/Builtins/_cd45
1 files changed, 26 insertions, 19 deletions
diff --git a/Completion/Builtins/_cd b/Completion/Builtins/_cd
index 634a62c66..3abe26049 100644
--- a/Completion/Builtins/_cd
+++ b/Completion/Builtins/_cd
@@ -13,7 +13,7 @@
 
 setopt localoptions nonomatch
 
-local expl
+local expl ret=1
 
 if [[ CURRENT -eq 3 ]]; then
   # cd old new: look for old in $PWD and see what can replace it
@@ -23,25 +23,32 @@ if [[ CURRENT -eq 3 ]]; then
   # Now remove all the common parts of $PWD and the completions from this
   rep=(${${rep#${PWD%%$words[2]*}}%${PWD#*$words[2]}})
   (( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
-elif _popd || [[ $PREFIX != (\~|/|./|../)* && $#cdpath -ne 0 ]]; then
-  local tdir tdir2
-
-  # With cdablevars, we can convert foo/bar/... to ~foo/bar/... if
-  # there is no directory foo.  In that case we could also complete
-  # variable names, but it hardly seems worth it.
-  # Note we need a tilde because cdablevars also allows user home
-  # directories, hence we also need nonomatch to suppress error messages.
-  if [[ -o cdablevars && -n "$PREFIX" && ! -d ${tdir::=${PREFIX%%/*}} &&
-        -d ${~tdir2::="~$tdir"} ]]; then
+else
+  _popd && ret=0
+
+  if [[ $PREFIX != (\~|/|./|../)* && $#cdpath -ne 0 ]]; then
+    local tdir tdir2
+
+    # With cdablevars, we can convert foo/bar/... to ~foo/bar/... if
+    # there is no directory foo.  In that case we could also complete
+    # variable names, but it hardly seems worth it.
+    # Note we need a tilde because cdablevars also allows user home
+    # directories, hence we also need nonomatch to suppress error messages.
+    if [[ -o cdablevars && -n "$PREFIX" && ! -d ${tdir::=${PREFIX%%/*}} &&
+          -d ${~tdir2::="~$tdir"} ]]; then
       PREFIX="~$PREFIX"
-      _wanted directories expl directory _path_files -/
+      _wanted directories expl directory _path_files -/ && ret=0
+    else
+      local tmpcdpath
+
+      tmpcdpath=(${${(@)cdpath:#.}:#$PWD})
+      _alternative \
+          'local-directories:local directories:_path_files -/' \
+	  "path-directories:directories in cdpath:_path_files -W tmpcdpath -/" && ret=0
+    fi
   else
-    local tmpcdpath
-    tmpcdpath=(${${(@)cdpath:#.}:#$PWD})
-    _alternative \
-        'local-directories:local directories:_path_files -/' \
-	"path-directories:directories in cdpath:_path_files -W tmpcdpath -/"
+    _wanted directories expl directory _path_files -/ && ret=0
   fi
-else
-  _wanted directories expl directory _path_files -/
+
+  return ret
 fi