From d908792fd49f71dd4bb68e771caca4b958e32ea7 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Thu, 21 Jun 2001 10:11:45 +0000 Subject: Completion for AUTO_CD. --- ChangeLog | 5 ++++ Completion/Zsh/Command/_cd | 54 ++++++++++++++++++++++++++++++++++++++ Completion/Zsh/Context/_autocd | 5 ++++ Completion/Zsh/Type/_command_names | 2 +- 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 Completion/Zsh/Command/_cd create mode 100644 Completion/Zsh/Context/_autocd diff --git a/ChangeLog b/ChangeLog index b7e14e29b..dfaad9066 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2001-06-21 Bart Schaefer + * 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 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 -- cgit 1.4.1