about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2001-06-21 10:11:45 +0000
committerBart Schaefer <barts@users.sourceforge.net>2001-06-21 10:11:45 +0000
commitd908792fd49f71dd4bb68e771caca4b958e32ea7 (patch)
treeb9b77607a391c125dd7ee9b199db06820cc724b9
parentc8f71a2dfab6520a929e7d5f1304ece7d8223fbf (diff)
downloadzsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.gz
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.xz
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.zip
Completion for AUTO_CD.
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Zsh/Command/_cd54
-rw-r--r--Completion/Zsh/Context/_autocd5
-rw-r--r--Completion/Zsh/Type/_command_names2
4 files changed, 65 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b7e14e29b..dfaad9066 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2001-06-21  Bart Schaefer  <schaefer@zsh.org>
 
+	* 15020: Completion/Zsh/Command/_cd, Completion/Zsh/Context/_autocd,
+	Completion/Zsh/Type/_command_names: When AUTO_CD is set, complete
+	directory names (including along cdpath) as well as commands when
+	in command position.
+
 	* 15018: Completion/compinit: Fix exit status of compdef.
 
 2001-06-20  Bart Schaefer  <schaefer@zsh.org>
diff --git a/Completion/Zsh/Command/_cd b/Completion/Zsh/Command/_cd
new file mode 100644
index 000000000..71fa1a8ad
--- /dev/null
+++ b/Completion/Zsh/Command/_cd
@@ -0,0 +1,54 @@
+#compdef cd chdir pushd
+
+# Handling of cd.
+#  - Normally just completes directories.  Uses cdpath if that's set
+#    and the string doesn't begin with ~, /, ./ or ../.
+#  - In the second argument to cd for the form `cd old new', completes
+#    possible `new' strings by examining `old' and $PWD.
+#  - After - or +, completes numbers, but the listing
+#    gives you the list of directories to complete.  This turns on
+#    menu-completion and lists the possibilities automatically, otherwise
+#    it's not a lot of use.  If you don't type the + or - it will
+#    complete directories as normal.
+
+setopt localoptions nonomatch
+
+local expl ret=1
+
+if [[ CURRENT -eq 3 ]]; then
+  # cd old new: look for old in $PWD and see what can replace it
+  local rep
+  # Get possible completions using word in position 2
+  rep=(${~PWD/$words[2]/*}~$PWD(-/))
+  # 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
+else
+  [[ CURRENT -gt 1 ]] && _directory_stack && 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 -/ && 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
+    _wanted directories expl directory _path_files -/ && ret=0
+  fi
+
+  return ret
+fi
diff --git a/Completion/Zsh/Context/_autocd b/Completion/Zsh/Context/_autocd
new file mode 100644
index 000000000..58ba5b17b
--- /dev/null
+++ b/Completion/Zsh/Context/_autocd
@@ -0,0 +1,5 @@
+#compdef -command-
+
+_command_names
+local ret=$?
+[[ -o autocd ]] && _cd || return ret
diff --git a/Completion/Zsh/Type/_command_names b/Completion/Zsh/Type/_command_names
index cf4088295..006006348 100644
--- a/Completion/Zsh/Type/_command_names
+++ b/Completion/Zsh/Type/_command_names
@@ -1,4 +1,4 @@
-#compdef -command-
+#autoload
 
 # The option `-e' if given as the first argument says that we should
 # complete only external commands and executable files. This and a