mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-13 11:21:13 +02:00
18153: new function for emulating bash's programmable completion system
This commit is contained in:
parent
8df030872c
commit
c53cbd300d
4 changed files with 195 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
|||
2003-01-29 Oliver Kiddle <opk@zsh.org>
|
||||
|
||||
* 18149, 18153, 18156: Completion/bashcompinit, Doc/Zsh/compsys.yo:
|
||||
new function for emulating bash's programmable completion system
|
||||
|
||||
2003-01-27 Oliver Kiddle <opk@zsh.org>
|
||||
|
||||
* Doug Kearns: 18141: Completion/Unix/Command/_elinks:
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
DISTFILES_SRC='
|
||||
.cvsignore .distfiles README Makefile.in
|
||||
.distfiles
|
||||
.cvsignore README compaudit compdump compinit compinstall
|
||||
bashcompinit
|
||||
'
|
||||
|
|
179
Completion/bashcompinit
Normal file
179
Completion/bashcompinit
Normal file
|
@ -0,0 +1,179 @@
|
|||
#autoload
|
||||
|
||||
_bash_complete() {
|
||||
local ret=1
|
||||
local -a suf matches
|
||||
local COMP_POINT COMP_CWORD
|
||||
local -a COMP_WORDS COMPREPLY BASH_VERSINFO
|
||||
local COMP_LINE="$words"
|
||||
local -A savejobstates savejobtexts
|
||||
set -- $=_bash_comps[$service]
|
||||
|
||||
(( COMP_POINT = 1 + ${#${(j. .)words[1,CURRENT-1]}} + $#QIPREFIX + $#IPREFIX + $#PREFIX ))
|
||||
(( COMP_CWORD = CURRENT - 1))
|
||||
COMP_WORDS=( $words )
|
||||
BASH_VERSINFO=( 2 05b 0 1 release )
|
||||
|
||||
savejobstates=( ${(kv)jobstates} )
|
||||
savejobtexts=( ${(kv)jobtexts} )
|
||||
|
||||
[[ ${argv[${argv[(I)nospace]:-0}-1]} = -o ]] && suf=( -S '' )
|
||||
|
||||
matches=( ${(f)"$(compgen $@)"} )
|
||||
|
||||
if [[ -n $matches ]]; then
|
||||
if [[ ${argv[${argv[(I)filenames]:-0}-1]} = -o ]]; then
|
||||
compset -P '*/' && matches=( ${matches##*/} )
|
||||
compset -S '/*' && matches=( ${matches%%/*} )
|
||||
compadd -f "${suf[@]}" -a matches && ret=0
|
||||
else
|
||||
compadd "${suf[@]}" -a matches && ret=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( ret )); then
|
||||
if [[ ${argv[${argv[(I)default]:-0}-1]} = -o ]]; then
|
||||
_default "${suf[@]}" && ret=0
|
||||
elif [[ ${argv[${argv[(I)dirnames]:-0}-1]} = -o ]]; then
|
||||
_directories "${suf[@]}" && ret=0
|
||||
fi
|
||||
fi
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
compgen() {
|
||||
local opts prefix suffix job OPTARG OPTIND ret=1
|
||||
local -a name res results jids
|
||||
local -A shortopts
|
||||
|
||||
emulate -L sh
|
||||
setopt kshglob noshglob braceexpand nokshautoload
|
||||
|
||||
shortopts=(
|
||||
a alias b builtin c command d directory e export f file
|
||||
g group j job k keyword u user v variable
|
||||
)
|
||||
|
||||
while getopts "o:A:G:C:F:P:S:W:X:abcdefgjkuv" name; do
|
||||
case $name in
|
||||
[abcdefgjkuv]) OPTARG="${shortopts[$name]}" ;&
|
||||
A)
|
||||
case $OPTARG in
|
||||
alias) results=( "${results[@]}" "${(k)aliases[@]}" ) ;;
|
||||
arrayvar) results=( "${results[@]}" "${(k@)parameters[(R)array*]}" ) ;;
|
||||
binding) results=( "${results[@]}" "${(k)widgets[@]}" ) ;;
|
||||
builtin) results=( "${results[@]}" "${(k)builtins[@]}" "${(k)dis_builtins[@]}" ) ;;
|
||||
command)
|
||||
results=(
|
||||
"${results[@]}" "${(k)commands[@]}" "${(k)aliases[@]}"
|
||||
"${(k)builtins[@]}" "${(k)functions[@]}" "${(k)reswords[@]}"
|
||||
)
|
||||
;;
|
||||
directory)
|
||||
setopt bareglobqual
|
||||
results=( "${results[@]}" ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N-/) )
|
||||
setopt nobareglobqual
|
||||
;;
|
||||
disabled) results=( "${results[@]}" "${(k)dis_builtins[@]}" ) ;;
|
||||
enabled) results=( "${results[@]}" "${(k)builtins[@]}" ) ;;
|
||||
export) results=( "${results[@]}" "${(k)parameters[(R)*export*]}" ) ;;
|
||||
file)
|
||||
setopt bareglobqual
|
||||
results=( "${results[@]}" ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N) )
|
||||
setopt nobareglobqual
|
||||
;;
|
||||
function) results=( "${results[@]}" "${(k)functions[@]}" ) ;;
|
||||
group)
|
||||
emulate zsh
|
||||
_groups -U -O res
|
||||
emulate sh
|
||||
setopt kshglob noshglob braceexpand
|
||||
results=( "${results[@]}" "${res[@]}" )
|
||||
;;
|
||||
hostname)
|
||||
emulate zsh
|
||||
_hosts -U -O res
|
||||
emulate sh
|
||||
setopt kshglob noshglob braceexpand
|
||||
results=( "${results[@]}" "${res[@]}" )
|
||||
;;
|
||||
job) results=( "${results[@]}" "${savejobtexts[@]%% *}" );;
|
||||
keyword) results=( "${results[@]}" "${(k)reswords[@]}" ) ;;
|
||||
running)
|
||||
jids=( "${(@k)savejobstates[(R)running*]}" )
|
||||
for job in "${jids[@]}"; do
|
||||
results=( "${results[@]}" ${savejobtexts[$job]%% *} )
|
||||
done
|
||||
;;
|
||||
stopped)
|
||||
jids=( "${(@k)savejobstates[(R)suspended*]}" )
|
||||
for job in "${jids[@]}"; do
|
||||
results=( "${results[@]}" ${savejobtexts[$job]%% *} )
|
||||
done
|
||||
;;
|
||||
setopt|shopt) results=( "${results[@]}" "${(k)options[@]}" ) ;;
|
||||
signal) results=( "${results[@]}" "SIG${^signals[@]}" ) ;;
|
||||
user) results=( "${results[@]}" "${(k)userdirs[@]}" ) ;;
|
||||
variable) results=( "${results[@]}" "${(k)parameters[@]}" ) ;;
|
||||
helptopic) ;;
|
||||
esac
|
||||
;;
|
||||
F)
|
||||
COMPREPLY=()
|
||||
$OPTARG "${words[0]}" "${words[CURRENT-1]}" "${words[CURRENT-2]}"
|
||||
results=( "${results[@]}" "${COMPREPLY[@]}" )
|
||||
;;
|
||||
G)
|
||||
setopt nullglob
|
||||
results=( "${results[@]}" ${~OPTARG} )
|
||||
unsetopt nullglob
|
||||
;;
|
||||
W) eval "results=( "${results[@]}" $OPTARG )" ;;
|
||||
C) results=( "${results[@]}" $(eval $OPTARG) ) ;;
|
||||
P) prefix="$OPTARG" ;;
|
||||
S) suffix="$OPTARG" ;;
|
||||
X)
|
||||
if [[ ${OPTARG[0]} = '!' ]]; then
|
||||
results=( "${(M)results[@]:#${OPTARG#?}}" )
|
||||
else
|
||||
results=( "${results[@]:#$OPTARG}" )
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# support for the last, `word' option to compgen. Zsh's matching does a
|
||||
# better job but if you need to, comment this in and use compadd -U
|
||||
#shift $(( OPTIND - 1 ))
|
||||
#(( $# )) && results=( "${(M)results[@]:#$1*}" )
|
||||
|
||||
print -l -- "$prefix${^results[@]}$suffix"
|
||||
}
|
||||
|
||||
complete() {
|
||||
emulate -L zsh
|
||||
local args void cmd print remove
|
||||
args=( "$@" )
|
||||
zparseopts -D -a void o: A: G: W: C: F: P: S: X: a b c d e f g j k u v \
|
||||
p=print r=remove
|
||||
if [[ -n $print ]]; then
|
||||
for cmd in ${(k)_bash_comps}; do
|
||||
print "complete ${_bash_comps[$cmd]} $cmd"
|
||||
done
|
||||
elif [[ -n $remove ]]; then
|
||||
for cmd; do
|
||||
unset "_bash_comps[$cmd]"
|
||||
done
|
||||
else
|
||||
for cmd; do
|
||||
_bash_comps[$cmd]="${args[1,-1-$#]}"
|
||||
done
|
||||
compdef _bash_complete "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
typeset -gA _bash_comps
|
||||
unfunction bashcompinit
|
||||
autoload -U bashcompinit
|
||||
return 0
|
|
@ -2646,6 +2646,14 @@ tt(COMPLETE_IN_WORD) option is set; otherwise, the cursor will
|
|||
be moved to the end of the current word before the completion code is
|
||||
called and hence there will be no suffix.
|
||||
)
|
||||
findex(bashcompinit)
|
||||
item(tt(bashcompinit))(
|
||||
This function provides compatibility with bash's programmable completion
|
||||
system. When run it will define the functions, tt(compgen) and
|
||||
tt(complete) which correspond to the bash builtins with the same names. It
|
||||
will then be possible to use completion specifications and functions
|
||||
written for bash.
|
||||
)
|
||||
enditem()
|
||||
|
||||
texinode(Bindable Commands)(Completion Functions)(Control Functions)(Completion System)
|
||||
|
|
Loading…
Reference in a new issue