1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-11-20 14:04:03 +01:00
zsh/Completion/Builtins/_cd

55 lines
2.0 KiB
Plaintext
Raw Normal View History

2000-04-01 22:43:43 +02:00
#compdef cd chdir pushd
1999-04-15 20:05:38 +02:00
2000-04-01 22:43:43 +02:00
# 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
2000-09-07 11:14:22 +02:00
local expl ret=1
2000-04-01 22:43:43 +02:00
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(-/))
2000-04-01 22:43:43 +02:00
# Now remove all the common parts of $PWD and the completions from this
rep=(${${rep#${PWD%%$words[2]*}}%${PWD#*$words[2]}})
2000-05-31 11:38:25 +02:00
(( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
2000-09-07 11:14:22 +02:00
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
2000-04-01 22:43:43 +02:00
PREFIX="~$PREFIX"
2000-09-07 11:14:22 +02:00
_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
2000-04-01 22:43:43 +02:00
else
2000-09-07 11:14:22 +02:00
_wanted directories expl directory _path_files -/ && ret=0
2000-04-01 22:43:43 +02:00
fi
2000-09-07 11:14:22 +02:00
return ret
2000-04-01 22:43:43 +02:00
fi