mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-11-28 03:10:56 +01:00
Improve completion for `cd' with cdablevars set; cleanup in _cd and _tilde (15152)
This commit is contained in:
parent
9282cbc1a7
commit
3eaedd99a0
3 changed files with 56 additions and 26 deletions
|
|
@ -1,3 +1,9 @@
|
||||||
|
2001-06-28 Sven Wischnowsky <wischnow@zsh.org>
|
||||||
|
|
||||||
|
* Bart: 15106, small changes in 15152: Completion/Zsh/Command/_cd,
|
||||||
|
Completion/Zsh/Context/_tilde: Improve completion for `cd' with
|
||||||
|
cdablevars set; cleanup in _cd and _tilde
|
||||||
|
|
||||||
2001-06-27 Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
|
2001-06-27 Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
|
||||||
|
|
||||||
* 15151: zshconfig.ac: enable-sitefndir should have been
|
* 15151: zshconfig.ac: enable-sitefndir should have been
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
# and the string doesn't begin with ~, /, ./ or ../.
|
# and the string doesn't begin with ~, /, ./ or ../.
|
||||||
# - In the second argument to cd for the form `cd old new', completes
|
# - In the second argument to cd for the form `cd old new', completes
|
||||||
# possible `new' strings by examining `old' and $PWD.
|
# possible `new' strings by examining `old' and $PWD.
|
||||||
# - After - or +, completes numbers, but the listing
|
# - After - or +, _directory_stack completes numbers, but the listing
|
||||||
# gives you the list of directories to complete. This turns on
|
# gives you the list of directories to complete. This turns on
|
||||||
# menu-completion and lists the possibilities automatically, otherwise
|
# menu-completion and lists the possibilities automatically, otherwise
|
||||||
# it's not a lot of use. If you don't type the + or - it will
|
# it's not a lot of use. If you don't type the + or - it will
|
||||||
|
|
@ -24,31 +24,55 @@ if [[ CURRENT -eq 3 ]]; then
|
||||||
rep=(${${rep#${PWD%%$words[2]*}}%${PWD#*$words[2]}})
|
rep=(${${rep#${PWD%%$words[2]*}}%${PWD#*$words[2]}})
|
||||||
(( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
|
(( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
|
||||||
else
|
else
|
||||||
[[ CURRENT -gt 1 ]] && _directory_stack && ret=0
|
# Complete directory stack entries with ~ or when not in command position
|
||||||
|
# (the rest of this test is optimization for the _tilde call below)
|
||||||
if [[ $PREFIX != (\~|/|./|../)* && $#cdpath -ne 0 ]]; then
|
if [[ "$PREFIX" == (#b)(\~|)[^/]# &&
|
||||||
local tdir tdir2
|
( -n "$match[1]" || ( CURRENT -gt 1 && ! -o cdablevars ) ) ]]; then
|
||||||
|
_directory_stack && ret=0
|
||||||
# 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
|
fi
|
||||||
|
|
||||||
|
if [[ $PREFIX != (\~|/|./|../)* ]]; then
|
||||||
|
local tmpcdpath
|
||||||
|
tmpcdpath=(${${(@)cdpath:#.}:#$PWD})
|
||||||
|
|
||||||
|
# With cdablevars, we can complete foo as if ~foo/
|
||||||
|
if [[ -o cdablevars && -n "$PREFIX" ]]; then
|
||||||
|
if [[ "$PREFIX" != */* ]]; then
|
||||||
|
_tilde && ret=0
|
||||||
|
else
|
||||||
|
local oipre="$IPREFIX" opre="$PREFIX" dirpre dir
|
||||||
|
|
||||||
|
# Note we need a tilde because cdablevars also allows user home
|
||||||
|
# directories, hence nonomatch (above) to suppress error messages.
|
||||||
|
|
||||||
|
dirpre="${PREFIX%%/*}/"
|
||||||
|
IPREFIX="$IPREFIX$dirpre"
|
||||||
|
eval "dir=( ~$dirpre )"
|
||||||
|
PREFIX="${PREFIX#*/}"
|
||||||
|
|
||||||
|
[[ $#dir -eq 1 && "$dir[1]" != "~$dirpre" ]] &&
|
||||||
|
_wanted named-directories expl 'directories after cdablevar' \
|
||||||
|
_path_files -W dir -/ && ret=0
|
||||||
|
|
||||||
|
PREFIX="$opre"
|
||||||
|
IPREFIX="$oipre"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ $#tmpcdpath -ne 0 ]]; then
|
||||||
|
# Don't complete local directories in command position, that's
|
||||||
|
# already handled by _command_names (see _autocd)
|
||||||
|
if [[ CURRENT -eq 1 ]]; then
|
||||||
|
_wanted path-directories expl 'directories in cdpath' \
|
||||||
|
_path_files -W tmpcdpath -/ && ret=0
|
||||||
|
else
|
||||||
|
_alternative \
|
||||||
|
'local-directories:local directories:_path_files -/' \
|
||||||
|
"path-directories:directories in cdpath:_path_files -W tmpcdpath -/" && ret=0
|
||||||
|
fi
|
||||||
|
return ret
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_wanted directories expl directory _path_files -/ && ret=0
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
[[ -n "$compstate[quote]" ]] && return 1
|
[[ -n "$compstate[quote]" ]] && return 1
|
||||||
|
|
||||||
local expl suf dirs list lines revlines i ret disp nm="$compstate[nmatches]"
|
local expl suf ret
|
||||||
|
|
||||||
if [[ "$SUFFIX" = */* ]]; then
|
if [[ "$SUFFIX" = */* ]]; then
|
||||||
ISUFFIX="/${SUFFIX#*/}$ISUFFIX"
|
ISUFFIX="/${SUFFIX#*/}$ISUFFIX"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue