summaryrefslogtreecommitdiffstats
path: root/Completion
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 /Completion
parentFix exit status of compdef. (diff)
downloadzsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.gz
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.bz2
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.lz
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.xz
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.tar.zst
zsh-d908792fd49f71dd4bb68e771caca4b958e32ea7.zip
Completion for AUTO_CD.
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Zsh/Command/_cd54
-rw-r--r--Completion/Zsh/Context/_autocd5
-rw-r--r--Completion/Zsh/Type/_command_names2
3 files changed, 60 insertions, 1 deletions
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