1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-06 11:21:22 +02:00

manual/8992

This commit is contained in:
Tanaka Akira 1999-12-10 14:47:55 +00:00
parent d5d015115c
commit 188e6569db
49 changed files with 1061 additions and 699 deletions

View file

@ -162,7 +162,7 @@ while [[ "$1" = -(O*|C) ]]; do
esac
done
_style -s options auto-description autod
zstyle -s ":completion${curcontext}:options" auto-description autod
if (( $# )) && comparguments -i "$autod" "$@"; then
local nm="$compstate[nmatches]" action noargs aret expl local
@ -258,7 +258,7 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
fi
if [[ -z "$matched" ]] && _requested options &&
{ ! _style options prefix-needed ||
{ ! zstyle -t ":completion${curcontext}:options" prefix-needed ||
[[ "$origpre" = [-+]* ]] } ; then
local prevpre="$PREFIX" previpre="$IPREFIX"

View file

@ -78,7 +78,7 @@ key="${1%:*}"
num="${${1##*:}:-1}"
shift
if _style -a "$tag" "$style" tmp; then
if zstyle -a ":completion${curcontext}:$tag" "$style" tmp; then
eval "tmp=( \"\${(@M)tmp:#\${(j($sep))~pats}}\" )"
if (( keys[(in:num:)$key] != 1 )); then
eval "tmp=( \${tmp#\${(j(${sep}))~\${(@)\${(@)keys[2,(rn:num:)\$key]}/*/*}}$sep} )"

View file

@ -16,7 +16,7 @@ fi
_tags "$_type" || return 1
_style "$_type" verbose && _showd=yes
zstyle -t ":completion${curcontext}:$_type" verbose && _showd=yes
_description "$_type" _expl "$1"
shift
@ -27,7 +27,8 @@ else
compdescribe -i "$@"
fi
[[ "$_type" = options ]] && _style options prefix-hidden && _hide=yes
[[ "$_type" = options ]] &&
zstyle -t ":completion${curcontext}:options" prefix-hidden && _hide=yes
while compdescribe -g _args _tmpd _tmpmd _tmps _tmpms; do

View file

@ -50,7 +50,7 @@
# # We first search in the last ten words, then in the last
# # twenty words, and so on...
# while [[ i -le max ]]; do
# if _style history-words sort; then
# if zstyle -t ":completion${curcontext}:history-words" sort; then
# _description history-words expl "history ($n)"
# else
# _description -V history-words expl "history ($n)"

View file

@ -4,9 +4,10 @@ local expl disp jobs job jids pfx='%' desc
_tags jobs || return 1
_style jobs prefix-needed && [[ "$PREFIX" != %* ]] && return 1
_style jobs prefix-hidden && pfx=''
_style jobs verbose && desc=yes
zstyle -t ":completion${curcontext}:jobs" prefix-needed &&
[[ "$PREFIX" != %* ]] && return 1
zstyle -t ":completion${curcontext}:jobs" prefix-hidden && pfx=''
zstyle -t ":completion${curcontext}:jobs" verbose && desc=yes
if [[ "$1" = -r ]]; then
jids=( "${(@k)jobstates[(R)running*]}" )
@ -30,7 +31,7 @@ if [[ -n "$desc" ]]; then
done
fi
if _style jobs strings; then
if zstyle -t ":completion${curcontext}:jobs" strings; then
local texts i text str tmp
# Find shortest unambiguous strings.

View file

@ -330,7 +330,7 @@ _regex_arguments () {
local i state next
local cache_dir
_style -s regex cache-path cache_dir
zstyle -s ":completion${curcontext}:regex" cache-path cache_dir
[[ -z "$cache_dir" ]] && cache_dir="$HOME/.zsh/regex_arguments"
local cache_file="$cache_dir/$1"
local cache_test

View file

@ -21,14 +21,14 @@ elif [[ ${(Pt)${compstate[parameter]}} = array* ]]; then
while _tags; do
if _requested -V indexes expl 'array index'; then
ind=( {1..${#${(P)${compstate[parameter]}}}} )
if _style indexes verbose; then
if zstyle -t ":completion${curcontext}:indexes" verbose; then
list=()
for i in "$ind[@]"; do
[[ "$i" = ${PREFIX}*${SUFFIX} ]] &&
list=( "$list[@]"
"${i}:$(print -D ${(P)${compstate[parameter]}[$i]})" )
done
compdisplay list ' -- ' "$list[@]"
zformat -a list ' -- ' "$list[@]"
disp=( -d list)
else
disp=()

View file

@ -22,9 +22,9 @@ while _tags; do
compadd "$suf[@]" "$expl[@]" "$@" - "${(@k)nameddirs}"
if _requested -V directory-stack expl 'directory stack' &&
{ ! _style directory-stack prefix-needed ||
{ ! zstyle -t ":completion${curcontext}:directory-stack" prefix-needed ||
[[ "$PREFIX" = [-+]* ]] }; then
if _style directory-stack verbose; then
if zstyle -t ":completion${curcontext}:directory-stack" verbose; then
integer i
lines=("${PWD}" "${dirstack[@]}")

View file

@ -12,11 +12,11 @@ if [[ "$1" = -m ]]; then
shift 2
fi
_style -a ps list-arguments listargs
_style -a ps arguments args
zstyle -a ":completion${curcontext}:ps" list-arguments listargs
zstyle -a ":completion${curcontext}:ps" arguments args
(( $#listargs )) || listargs=( "$args[@]" )
if _style processes verbose; then
if zstyle -t ":completion${curcontext}:processes" verbose; then
list=("${(@Mr:COLUMNS-1:)${(f@)$(command ps $listargs 2>/dev/null)}[2,-1]:#[ ]#${PREFIX}[0-9]#${SUFFIX}[ ]*${~match}}")
desc=(-ld list)
else

View file

@ -11,9 +11,10 @@ local expl list lines revlines disp
_wanted -V directory-stack expl 'directory stack' || return 1
! _style directory-stack prefix-needed || [[ $PREFIX = [-+]* ]] || return 1
! zstyle -t ":completion${curcontext}:directory-stack" prefix-needed ||
[[ $PREFIX = [-+]* ]] || return 1
if _style directory-stack verbose; then
if zstyle -t ":completion${curcontext}:directory-stack" verbose; then
# get the list of directories with their canonical number
# and turn the lines into an array, removing the current directory
lines=("${PWD}" "${dirstack[@]}")

View file

@ -7,7 +7,7 @@ if [[ CURRENT -eq 2 ]]; then
_wanted -C - jobs expl 'scheduled jobs' || return 1
lines=(${(f)"$(sched)"})
if _style jobs verbose; then
if zstyle -t ":completion${curcontext}:jobs" verbose; then
disp=( -ld lines )
else
disp=()

View file

@ -21,11 +21,12 @@ done
[[ "$1" = -(|-) ]] && shift
if _wanted signals expl signal &&
{ [[ -z "$minus" ]] || ! _style signals prefix-needed ||
{ [[ -z "$minus" ]] ||
! zstyle -t ":completion${curcontext}:signals" prefix-needed ||
[[ "$PREFIX" = -* ]] } ; then
local disp tmp
if _style signals prefix-hidden; then
if zstyle -t ":completion${curcontext}:signals" prefix-hidden; then
tmp=( "${(@)signals[1,last]}" )
disp=(-d tmp)
else

View file

@ -9,7 +9,8 @@ else
while _tags; do
_requested options expl 'inode element' &&
{ ! _style options prefix-needed || [[ "$PREFIX[1]" = + ]] } &&
{ ! zstyle -t ":completion${curcontext}:options" prefix-needed ||
[[ "$PREFIX[1]" = + ]] } &&
compadd "$expl[@]" - +device +inode +mode +nlink +uid +gid +rdev \
+size +atime +mtime +ctime +blksize +block +link
fi

View file

@ -25,9 +25,9 @@ _history_complete_word () {
direction=older
fi
_style -s history-words stop stop
zstyle -s ":completion${curcontext}:history-words" stop stop
_style history-words list || compstate[list]=''
zstyle -t ":completion${curcontext}:history-words" list || compstate[list]=''
if [[ -n "$compstate[old_list]" &&
( -n "$stop" || "$compstate[insert]" = menu ) ]] ; then
@ -67,14 +67,14 @@ _history_complete_word () {
}
_history_complete_word_gen_matches () {
if _style history-words list; then
if _style history-words sort; then
if zstyle -t ":completion${curcontext}:history-words" list; then
if zstyle -t ":completion${curcontext}:history-words" sort; then
_description history-words expl 'history word'
else
_description -V history-words expl 'history word'
fi
else
if _style history-words sort; then
if zstyle -t ":completion${curcontext}:history-words" sort; then
expl=()
else
expl=('-V' '')
@ -84,7 +84,7 @@ _history_complete_word_gen_matches () {
[[ -n "$_hist_stop" ]] && PREFIX="$_hist_old_prefix"
local rem_dups
if _style history-words remove-all-dups; then
if zstyle -t ":completion${curcontext}:history-words" remove-all-dups; then
rem_dups=''
else
rem_dups='-1'

View file

@ -20,7 +20,7 @@ local curcontext="${curcontext}" oldcontext
oldcontext="$curcontext"
_style -s '' max-errors cfgacc
zstyle -s ":completion${curcontext}:" max-errors cfgacc
# Get the number of errors to accept.
@ -79,11 +79,12 @@ while [[ _comp_correct -le comax ]]; do
"e:$_comp_correct" "o:$PREFIX$SUFFIX"
if _complete; then
if _style '' insert-unambiguous &&
if zstyle -t ":completion${curcontext}:" insert-unambiguous &&
[[ "${#compstate[unambiguous]}" -ge "${#:-$PREFIX$SUFFIX}" ]]; then
compstate[pattern_insert]=unambiguous
elif _requested original &&
( [[ compstate[nmatches] -gt 1 ]] || _style '' original ); then
( [[ compstate[nmatches] -gt 1 ]] ||
zstyle -t ":completion${curcontext}:" original ); then
local expl
_description -V original expl original

View file

@ -16,17 +16,19 @@ _setup "$1"
name="$2"
_style -s "$1" format format || _style -s descriptions format format
zstyle -s ":completion${curcontext}:$1" format format ||
zstyle -s ":completion${curcontext}:descriptions" format format
_style -s "$1" hidden hidden
zstyle -s ":completion${curcontext}:$1" hidden hidden
if [[ "$hidden" = (all|yes|true|1|on) ]]; then
[[ "$hidden" = all ]] && format=''
hide=(-n)
fi
_style -s "$1" group-name gname && [[ -z "$gname" ]] && gname="$1"
zstyle -s ":completion${curcontext}:$1" group-name gname &&
[[ -z "$gname" ]] && gname="$1"
shift 2
[[ -n "$format" ]] && compfmt format "$format" "d:$1" "${(@)argv[2,-1]}"
[[ -n "$format" ]] && zformat -f format "$format" "d:$1" "${(@)argv[2,-1]}"
if [[ -n "$gname" ]]; then
if [[ -n "$format" ]]; then

View file

@ -13,7 +13,8 @@ local exp word="$PREFIX$SUFFIX" sort expr expl curcontext="${curcontext}"
# First, see if we should insert all *completions*.
if _style -s '' completions expr && [[ "${(e):-\$[$expr]}" -eq 1 ]]; then
if zstyle -s ":completion${curcontext}:" completions expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]]; then
compstate[insert]=all
return 1
fi
@ -29,7 +30,8 @@ exp=("$word")
# First try substitution. That weird thing spanning multiple lines
# changes quoted spaces, tabs, and newlines into spaces.
_style -s '' substitute expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
zstyle -s ":completion${curcontext}:" substitute expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]] &&
exp=( "${(e)exp//\\[
]/ }" )
@ -39,7 +41,8 @@ _style -s '' substitute expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
# Now try globbing.
_style -s '' glob expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
zstyle -s ":completion${curcontext}:" glob expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]] &&
exp=( ${~exp}(N) )
# If we don't have any expansions or only one and that is the same
@ -50,7 +53,7 @@ _style -s '' glob expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
# Now add as matches whatever the user requested.
_style -s '' sort sort
zstyle -s ":completion${curcontext}:" sort sort
[[ "$sort" = (yes|true|1|on) ]] && exp=( "${(@o)exp}" )

View file

@ -8,7 +8,7 @@ local pre suf curcontext="${curcontext}:list" expr
# Get the strings to compare.
if _style '' word; then
if zstyle -t ":completion${curcontext}:" word; then
pre="$HISTNO$LBUFFER"
suf="$RBUFFER"
else
@ -18,7 +18,7 @@ fi
# Should we only show a list now?
_style -s '' condition expr
zstyle -s ":completion${curcontext}:" condition expr
if [[ ( -z "$expr" || "${(e):-\$[$expr]}" -eq 1 ) &&
( "$pre" != "$_list_prefix" || "$suf" != "$_list_suffix" ) ]]; then

View file

@ -17,7 +17,7 @@
# state than the global one for which you are completing.
local comp post ret=1 _compskip _prio_num=1 _cur_context format \
local comp post ret=1 _compskip _prio_num=1 format \
context state line opt_args val_args curcontext="$curcontext" \
_last_nmatches=-1 _last_menu_style _def_menu_style _menu_style sel \
_saved_exact="$compstate[exact]" \
@ -56,7 +56,7 @@ _last_menu_style=()
if (( ! $# )); then
local tmp
_style -a '' completer tmp
zstyle -a ":completion${curcontext}:" completer tmp
set -- "$tmp[@]"
fi
@ -139,7 +139,7 @@ fi
if [[ compstate[nmatches] -eq 0 &&
compstate[matcher] -eq compstate[total_matchers] &&
$#_lastdescr -ne 0 ]] &&
_style -s warnings format format; then
zstyle -s ":completion${curcontext}:warnings" format format; then
local str
compstate[list]='list force'
@ -151,7 +151,8 @@ if [[ compstate[nmatches] -eq 0 &&
*) str="${(j:, :)_lastdescr[1,-2]}, or $_lastdescr[-1]";;
esac
compadd -UX "${format//\\%d/$str}" -n ''
zformat -f format "$format" "d:$str"
compadd -UX "$format" -n ''
fi
_lastcomp=( "${(@kv)compstate}" )

View file

@ -19,8 +19,8 @@ tmp="${${:-$PREFIX$SUFFIX}#[~=]}"
[[ "$tmp:q" = "$tmp" ||
compstate[matcher] -ne compstate[total_matchers] ]] && return 1
_style -s '' original orig
_style -b '' insert-unambiguous ins
zstyle -s ":completion${curcontext}:" original orig
zstyle -b ":completion${curcontext}:" insert-unambiguous ins
# Try completion without inserting a `*'?

View file

@ -4,10 +4,11 @@ local format
_tags messages || return 1
_style -s messages format format || _style -s descriptions format format
zstyle -s ":completion${curcontext}:messages" format format ||
zstyle -s ":completion${curcontext}:descriptions" format format
if [[ -n "$format" ]]; then
compfmt format "$format" "d:$1" "${(@)argv[2,-1]}"
zformat -f format "$format" "d:$1" "${(@)argv[2,-1]}"
if [[ $compstate[nmatches] -eq 0 ]]; then
compstate[list]='list force'
compstate[insert]=''

View file

@ -2,7 +2,7 @@
local curcontext="${curcontext}:oldlist" list
_style -s '' list list
zstyle -s ":completion${curcontext}:" list list
# If this is a listing widget and there is already an old list,
# and either the style :oldlist:list is `always', or it is not `never'
@ -33,7 +33,8 @@ fi
if [[ -z $compstate[old_insert] && -n $compstate[old_list] ]]; then
compstate[old_list]=keep
elif [[ $WIDGET = *complete(|-prefix|-word) ]] && _style '' menu; then
elif [[ $WIDGET = *complete(|-prefix|-word) ]] &&
zstyle -t ":completion${curcontext}:" menu; then
if [[ -n $compstate[old_insert] ]]; then
compstate[old_list]=keep
if [[ $WIDGET = *reverse* ]]; then

View file

@ -116,7 +116,7 @@ orig="${PREFIX}${SUFFIX}"
# If given no `-F' option, we want to use the `ignored-suffixes'-style.
if (( ! $#ignore )); then
if _style -a files ignored-suffixes ignore; then
if zstyle -a ":completion${curcontext}:files" ignored-suffixes ignore; then
ignore=(-F "( $ignore )")
else
@ -347,8 +347,10 @@ for prepath in "$prepaths[@]"; do
tmp4="$testpath"
compquote tmp1 tmp4
if [[ -n $menu ]] || ! _style paths expand '*suffix*'; then
_style paths cursor && compstate[to_end]=''
if [[ -n $menu ]] ||
! zstyle -t ":completion${curcontext}:paths" expand suffix; then
zstyle -t ":completion${curcontext}:paths" cursor &&
compstate[to_end]=''
if [[ "$tmp3" = */* ]]; then
compadd -Qf "$mopts[@]" -p "$linepath$tmp4" -s "/${tmp3#*/}" \
-W "$prepath$realpath$testpath" "$ignore[@]" \
@ -436,7 +438,7 @@ done
exppaths=( "${(@)exppaths:#$orig}" )
if _style paths expand '*prefix*' &&
if zstyle -t ":completion${curcontext}:paths" expand prefix &&
[[ $#exppaths -gt 0 && nm -eq compstate[nmatches] ]]; then
PREFIX="${opre}"
SUFFIX="${osuf}"

View file

@ -8,8 +8,6 @@ else
tag="$1"
fi
comptags -C _cur_context
comptags -R "$tag" &&
if [[ $# -gt 1 ]]; then
_description "$@"

View file

@ -2,7 +2,7 @@
local val nm="$compstate[nmatches]"
if _style -a "$1" list-colors val; then
if zstyle -a ":completion${curcontext}:$1" list-colors val; then
if [[ "$1" = default ]]; then
ZLS_COLORS="${(j.:.)${(@)val:gs/:/\\\:}}"
else
@ -10,7 +10,7 @@ if _style -a "$1" list-colors val; then
fi
fi
if _style -s "$1" list-packed val; then
if zstyle -s ":completion${curcontext}:$1" list-packed val; then
if [[ "$val" = (yes|true|1|on) ]]; then
compstate[list]="${compstate[list]} packed"
else
@ -20,7 +20,7 @@ else
compstate[list]="$_saved_list"
fi
if _style -s "$1" list-rows-first val; then
if zstyle -s ":completion${curcontext}:$1" list-rows-first val; then
if [[ "$val" = (yes|true|1|on) ]]; then
compstate[list]="${compstate[list]} rows"
else
@ -30,7 +30,7 @@ else
compstate[list]="$_saved_list"
fi
if _style -s "$1" last-prompt val; then
if zstyle -s ":completion${curcontext}:$1" last-prompt val; then
if [[ "$val" = (yes|true|1|on) ]]; then
compstate[last_prompt]=yes
else
@ -40,7 +40,7 @@ else
compstate[last_prompt]="$_saved_lastprompt"
fi
if _style -s "$1" accept-exact val; then
if zstyle -s ":completion${curcontext}:$1" accept-exact val; then
if [[ "$val" = (yes|true|1|on) ]]; then
compstate[exact]=accept
else
@ -53,7 +53,7 @@ fi
[[ _last_nmatches -ge 0 && _last_nmatches -ne nm ]] &&
_menu_style=( "$_last_menu_style[@]" "$_menu_style[@]" )
if _style -a "$1" menu val; then
if zstyle -a ":completion${curcontext}:$1" menu val; then
_last_nmatches="$nm"
_last_menu_style=( "$val[@]" )
else

View file

@ -18,7 +18,7 @@ if (( $# )); then
[[ "$1" = -(|-) ]] && shift
if _style -a '' group-order order; then
if zstyle -a ":completion${curcontext}" group-order order; then
local name
for name in "$order[@]"; do
@ -42,10 +42,6 @@ if (( $# )); then
"${_sort_tags:-_sort_tags}" "$@"
# Also store the context (used below and in _requested).
_cur_context="$curcontext"
# Return non-zero if at least one set of tags should be used.
comptags -T
@ -57,10 +53,6 @@ fi
local tags
# Reset the current context.
comptags -C _cur_context
_failed_tags=( "$_failed_tags[@]" "$_last_tags[@]" )
# Return failure if no sets remaining.

View file

@ -440,19 +440,19 @@ compstyle() {
if (( ! $# )); then
local pats styles vals pat style pre eq
compstyles -G pats
zstyle -g pats
for pat in "$pats[@]"; do
for pat in "${(@M)pats:#:completion*}"; do
if [[ -n "$long" ]]; then
pre="compstyle ${(qq)pat} "
pre="compstyle ${(qq)pat#:completion} "
else
print "$pat"
print "${pat#:completion}"
pre=' '
eq=' ='
fi
compstyles -G styles "$pat"
zstyle -g styles "$pat"
for style in "$styles[@]"; do
compstyles -G vals "$pat" "$style"
zstyle -g vals "$pat" "$style"
print "${pre}${style}${eq}" "${(@qq)vals}"
done
done
@ -461,26 +461,24 @@ compstyle() {
fi
if [[ "$1" = -d ]]; then
case "$#" in
1) compstyles -d ;;
2) compstyles -d "$2" ;;
*)
local pat="$2" style
if [[ $# -gt 1 ]]; then
zstyle -d ":completion$2" "${(@)argv[3,-1]}"
else
local pats
shift
zstyle -g pats
for style; do
compstyles -d "$pat" "$style"
for pat in "${(@M)pats:#:completion}"; do
zstyle -d "$pat"
done
;;
esac
fi
return 0
fi
[[ "$1" = -(|-) ]] && shift
compstyles -a "$@"
zstyle - ":completion$1" "${(@)argv[2,-1]}"
return 0
}

View file

@ -106,7 +106,7 @@ tmp2=("$tmp2[@]" $_ra_left${(M)^short_bool:#$~tmp1} $_ra_left${(M)^short_intleve
tmp3=("$tmp3[@]" $_ra_left${(M)^short_hasarg:#$~tmp1} $_ra_left${(M)^short_configfile:#$~tmp1} $_ra_left${(M)^short_arbitem:#$~tmp1})
_describe -o option tmp2 -- tmp3 -S='
comp_opt='{ ! _style options prefix-needed || [[ "$PREFIX" = -* ]] }'" && { $comp_short; $comp_long }"
comp_opt='{ ! zstyle -t ":completion${curcontext}:options" prefix-needed || [[ "$PREFIX" = -* ]] }'" && { $comp_short; $comp_long }"
regex_short=()
regex_long=()

View file

@ -488,7 +488,8 @@ _cvs_extract_file_entries () {
(( $+functions[_cvs_extract_modifiedfile_entries] )) ||
_cvs_extract_modifiedfile_entries () {
if _style cvs disable-stat || ! { zmodload -e stat || zmodload stat }; then
if zstyle -t ":completion${curcontext}:cvs" disable-stat ||
! { zmodload -e stat || zmodload stat }; then
_cvs_extract_file_entries
return
fi

View file

@ -4,7 +4,7 @@ local expl groups
_wanted groups expl group || return 1
if ! _style -a groups groups groups; then
if ! zstyle -a ":completion${curcontext}:groups" groups groups; then
(( $+_cache_groups )) ||
if (( ${+commands[ypcat]} )); then
: ${(A)_cache_groups:=${${(s: :)$(ypcat group.byname)}%%:*}} # If you use YP

View file

@ -2,7 +2,7 @@
local expl hosts
if ! _style -a hosts hosts hosts; then
if ! zstyle -a ":completion${curcontext}:hosts" hosts hosts; then
(( $+_cache_hosts )) ||
: ${(A)_cache_hosts:=${(s: :)${(ps:\t:)${${(f)"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}

View file

@ -2,7 +2,7 @@
local expl ports
if ! _style -a ports ports ports; then
if ! zstyle -a ":completion${curcontext}:ports" ports ports; then
(( $+_cache_ports )) ||
: ${(A)_cache_ports:=${${(M)${${(f)"$(</etc/services)"}:#\#*}#*/tcp}%%[ ]*}}

View file

@ -9,7 +9,8 @@ local curcontext="$curcontext" state line expl
typeset -A opt_args
[[ $CURRENT -eq 2 ]] && _wanted options expl option &&
{ ! _style options prefix-needed || [[ "$PREFIX" = -* ]] } &&
{ ! zstyle -t ":completion${curcontext}:options" prefix-needed ||
[[ "$PREFIX" = -* ]] } &&
compadd -M 'r:|[_-]=* r:|=*' "$expl[@]" - -version
_arguments -C -s \

View file

@ -40,8 +40,9 @@
local ipre scheme host user uhosts ret=1 expl
local urls_path localhttp
_style -s urls path urls_path || urls_path="${ZDOTDIR:-$HOME}/.zsh/urls"
_style -a urls local localhttp
zstyle -s ":completion${curcontext}:urls" path urls_path ||
urls_path="${ZDOTDIR:-$HOME}/.zsh/urls"
zstyle -a ":completion${curcontext}:urls" local localhttp
local localhttp_servername="$localhttp[1]"
local localhttp_documentroot="$localhttp[2]"
local localhttp_userdir="$localhttp[3]"

View file

@ -7,7 +7,7 @@ local expl users
_wanted users expl user || return 1
_style -a users users users &&
zstyle -a ":completion${curcontext}:users" users users &&
compadd "$expl[@]" "$@" - "$users[@]" && return 0
compadd "$@" "$expl[@]" - "${(@k)userdirs}"

View file

@ -15,7 +15,7 @@ if (( ! $+_color_cache )); then
# Cache of color names doesn't exist yet, create it.
_style -s colors path file
zstyle -s ":completion${curcontext}:colors" path file
if [[ -n "$file" ]]; then
_color_cache=( "${(@)${(@f)$(< $file)}[2,-1]##* }" )
else

View file

@ -258,37 +258,6 @@ In each of the forms supporting it the tt(-a) option makes the
var(function) autoloadable (exactly equivalent to
tt(autoload -U )var(function)).
)
findex(compstyle)
cindex(completion system, configuring)
xitem(tt(compstyle) var(pattern) var(style) var(strings ...))
xitem(tt(compstyle -d) [ var(pattern) [ var(styles ...) ] ])
item(tt(compstyle) [ tt(-L) ] )(
Several aspects of the completion system can be configured by the
user. This function allows to define so-called styles that are used by
various completion functions. These styles are associated with
patterns that are compared to context names used by the completion
system. The possible ways to configure the completion system are
explained in detail in
ifzman(the section `Completion System Configuration' below)\
ifnzman(noderef(Completion System Configuration))\
.
In the first form a new var(style) is defined for a certain
var(pattern), setting it to the value given by the var(strings). If there
was already a definition for the same var(pattern)/var(style) pair,
only the value is changed.
The second form with the tt(-d) option can be used to delete
definitions made by previous calls with the first form. Without any
arguments all definitions are removed. If a var(pattern) is given, all
styles defined for it are removed and if a var(pattern) and any number
of var(styles) are given, only those styles are removed for the
pattern.
In the last form (without arguments) all definitions are listed. If
the tt(-L) option is given this is done in the form of calls to
tt(compstyle).
)
enditem()
texinode(Completion System Configuration)(Control Functions)(Initialization)(Completion System)
@ -452,16 +421,17 @@ information needed to change the tt(_sort_tags) function when one
wants to change the way matches are generated for that context.
But the completion system can not only be configured by supplying a
specialized tt(_sort_tags) function. There are also the
`styles' defined with the tt(compstyle) function mentioned in
ifzman(the section `Initialization' above)\
ifnzman(noderef(Initialization))\
.
specialized tt(_sort_tags) function. It also uses `styles' defined
with the tt(zstyle) builtin command (see
ifzman(zmanref(zshmodules))\
ifnzman(noderef(The zutil Module))\
) using the prefix `tt(:completion)' and the context name when testing
and retrieving values.
For some tags the completion functions look up the definition of
certain styles set for the current context. These styles can have any
number of strings as their values and specify, for example, how the
matches are generated. The tt(compstyle) function defines mappings
matches are generated. The tt(zstyle) builtin command defines mappings
between patterns and style names with their values. Whenever a
completion function looks up the value of a style it uses the name of
the current context followed by a colon and the name of a tag. This
@ -473,11 +443,11 @@ simple and a verbose form and use the tt(verbose) style to decide
which form should be used. To make all such functions always use the
verbose form one can simply call
example(compstyle '*' verbose yes)
example(zstyle ':completion:*' verbose yes)
in one of the startup files like tt(.zshrc) (after the call to the
tt(compinit) function). This definition simply means that the
tt(verbose) style has tt(yes) as its value in every context.
in one of the startup files like tt(.zshrc). This definition simply
means that the tt(verbose) style has tt(yes) as its value in every
context.
The completion function for the tt(kill) builtin command uses this
style to decide if jobs and processes are listed only as job numbers
@ -486,7 +456,7 @@ and the command lines of the processes (the latter is achieved by
calling the tt(ps) command). To make this builtin list the matches
only as numbers one could call:
example(compstyle '*::kill:*' verbose no)
example(zstyle ':completion:*::kill:*' verbose no)
And if one wants to see the command lines for processes but not the
job texts one could use the fact that the tag name is appended to the
@ -494,21 +464,12 @@ context name when styles are looked up and instead of the previous
call use (remember that the function for the tt(kill) builtin command
uses the tags tt(jobs) and tt(processes)):
example(compstyle '*::kill:*:jobs' verbose no)
example(zstyle ':completion:*::kill:*:jobs' verbose no)
As said above, the patterns given to the tt(compstyle) function are
tested in the order in which they were given. But that isn't
completely true. In fact, this function roughly sorts the patterns so
that more specialized patterns are compared before more general
patterns. Due to this, the last two examples could be defined after
the first one because both `tt(*::kill:*)' and `tt(*::kill:*:jobs)' are
considered to be more specific then the pattern `tt(*)' from the first
example. To decide how specific a pattern is, the function looks at
the number of colons (corresponding to the number of components) used
in the pattern, and if these components are actual patterns (like the
`tt(*)') or simple strings (like the `tt(jobs)' in the last
example). Patterns with fewer colons and fewer simple strings are
considered to be less specific.
Due to the ordering tt(zstyle) does with the patterns defined, the
last two examples could be defined after the first one because both
`tt(*::kill:*)' and `tt(*::kill:*:jobs)' are considered to be more
specific then the pattern `tt(*)' from the first example.
As for tags, completion functions can use any number of styles, so
there can't be a complete list. However, the following two sections
@ -807,9 +768,9 @@ example, to use completion, approximation and correction for normal
completion, completion and correction for incremental completion and
only completion for prediction one could use:
example(compstyle '*' completer _complete _correct _approximate
compstyle ':incremental' completer _complete _correct
compstyle ':predict' completer _complete)
example(zstyle ':completion:*' completer _complete _correct _approximate
zstyle ':completion:incremental' completer _complete _correct
zstyle ':completion:predict' completer _complete)
)
item(tt(completions))(
This style is used by the tt(_expand) completer function.
@ -830,7 +791,7 @@ should be set to an expression usable inside a `tt($((...)))'
arithmetical expression. In this case, delaying will be done if the
expression evaluates to `tt(1)'. For example, with
example(compstyle ':list' condition 'NUMERIC != 1')
example(zstyle ':completion:list' condition 'NUMERIC != 1')
delaying will be done only if given an explicit numeric argument
other than `tt(1)'.
@ -882,6 +843,14 @@ replaced with the message given by the completion function.
Finally, for the tt(warnings) tag, it is printed when no matches could
be generated at all. In this case the `tt(%d)' is replaced with the
descriptions for the matches that were expected.
Here and in all other cases where the completion system uses `tt(%)'
sequences, the `tt(%)' may be followed by field with specifications as
described for the tt(zformat) builtin command from the tt(zutil)
module, see
ifzman(zmanref(zshmodules))\
ifnzman(noderef(The zutil Module))\
.
)
item(tt(glob))(
Like tt(complete), this is used by the tt(_expand) completer.
@ -901,8 +870,8 @@ aliases and shell functions and reserved words as possible
completions. To have the external commands and shell functions listed
separately, one can set:
example(compstyle '*:-command-:commands' group-name commands
compstyle '*:-command-:functions' group-name functions)
example(zstyle ':completion:*:-command-:commands' group-name commands
zstyle ':completion:*:-command-:functions' group-name functions)
This also means that if the same name is used for different types of
matches, then those matches will be displayed together in the same
@ -912,7 +881,7 @@ If the name given is the empty string, then the name of the tag for
the matches will be used as the name of the group. So, to have all
different types of matches displayed separately, one can just set:
example(compstyle '*' group-name '')
example(zstyle ':completion:*' group-name '')
All matches for which no group name is defined will be put in a group
named tt(-default-).
@ -931,7 +900,7 @@ For example, to have names of builtin commands, shell functions and
external commands appear in this order when completing in command
position one would set:
example(compstyle '*:-command-' group-order builtins functions commands)
example(zstyle ':completion:*:-command-' group-order builtins functions commands)
)
item(tt(groups))(
A style holding the names of the groups that should be completed. If
@ -1046,7 +1015,7 @@ the type described by the tag.
To be able to share the same specifications one has set up for the GNU
version of the tt(ls) command one can use:
example(compstyle '*:default' list-colors ${(s.:.)LS_COLORS})
example(zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS})
And to get the default colors (which are the same as for the GNU
tt(ls) command) one should set the style to an empty value.
@ -1082,7 +1051,7 @@ If the value for this style contains the string tt(numeric), the
completer function will take any numeric argument as the
maximum number of errors allowed. For example, with
example(compstyle ':approximate' accept 2 numeric)
example(zstyle ':completion:approximate' accept 2 numeric)
two errors will be allowed if no numeric argument is given. However,
with a numeric argument of six (as in `tt(ESC-6 TAB)'), up to six
@ -1241,7 +1210,7 @@ non-empty string it should be an expression usable inside a `tt($((...)))'
arithmetical expression. In this case, expansion of substitutions will
be done if the expression evaluates to `tt(1)'. For example, with
example(compstyle ':expand' substitute '${NUMERIC:-1} != 1')
example(zstyle ':completion:expand' substitute '${NUMERIC:-1} != 1')
substitution will be performed only if given an explicit numeric
argument other than `tt(1)', as by typing `tt(ESC 2 TAB)'.
@ -1295,7 +1264,7 @@ arguments are given, the set of functions to try is taken from the
tt(completer) style. For example, to use normal completion and
correction if that doesn't generate any matches:
example(compstyle '*' completer _complete _correct)
example(zstyle ':completion:*' completer _complete _correct)
after calling tt(compinit). The default value for this style set up
in tt(compinit) is `tt(_complete)', i.e. normally only ordinary
@ -1407,7 +1376,7 @@ counted. The resulting list of corrected and completed strings is then
presented to the user. The intended use of this completer function is to
try after the normal tt(_complete) completer by setting:
example(compstyle '*' completer _complete _approximate)
example(zstyle ':completion:*' completer _complete _approximate)
This will give correcting completion if and only if
normal completion doesn't yield any possible completions. When
@ -1436,9 +1405,9 @@ different top-level context name.
For example, with:
example(compstyle '*' completer _complete _correct _approximate
compstyle ':correct' accept 2 not-numeric
compstyle ':approximate' accept 3 numeric)
example(zstyle ':completion:*' completer _complete _correct _approximate
zstyle ':completion:correct' accept 2 not-numeric
zstyle ':completion:approximate' accept 3 numeric)
correction will accept up to two errors. If a numeric argument is
given, correction will not be performed, but correcting completion
@ -1837,48 +1806,6 @@ generated by the tt(_users) and tt(_hosts) functions respectively).
Like tt(_tags) this function supports the tt(-C) option to give an
additional context name component.
)
findex(_style)
item(tt(_style))(
This function is used to look up the values of styles defined by the
user. In its simplest form, it is called with two arguments: a tag and
a style-name. The tag (if non-empty) is temporarily appended to the
current context name (preceded by a colon) and the patterns defined by
the user with the tt(compstyle) function will be compared to that
combined name. If any of those patterns match the name and the given
style is defined for it and its boolean value is `true' (i.e. its
value is one of `tt(true)', `tt(on)', `tt(yes)', and `tt(1)'), tt(_style)
returns zero and non-zero otherwise. If you want to test the style not
only for a boolean value, you can give a third argument which is then
used as a pattern and tt(_style) returns zero if the pattern matches
the value defined for the style.
If you want to retrieve the value defined for the style, you can use
one of the options tt(-b) (to retrieve it as a boolean value, i.e. one
of tt(yes) or tt(no)), tt(-s) (to get it as a scalar, i.e. a string
concatenated from the value strings defined by the user, separated by
spaces), tt(-a) (to get it as an array), and tt(-h) (to get it as an
associative array; in this case the first, third, etc. strings from the
value are used as the keys and the others as their values). In each of
these cases the arguments after the option are the tag, the style-name
and the name of the parameter into which the result will be stored.
For example, to test if the tt(description) style is set to `true' for
the current context and the tag tt(foo):
example(if _style foo description; then
... # style is true
fi)
And to get the value of the tt(path) style for the tag tt(foo) as an
array into the parameter tt(tmp):
example(local tmp
_style -a foo path tmp)
In any case, the return value of this function is zero if a
definition for the style was found and non-zero if no definition was
found.
)
findex(_describe)
item(tt(_describe) var(descr) var(name1) [ var(name2) ] var(opts) ... tt(-)tt(-) ...)(
This function can be used to add options or values with descriptions

View file

@ -1,4 +1,4 @@
texinode(The clone Module)(The complete Module)(The cap Module)(Zsh Modules)
texinode(The clone Module)(The zutil Module)(The cap Module)(Zsh Modules)
sect(The clone Module)
The tt(clone) module makes available one builtin command:

View file

@ -1,4 +1,4 @@
texinode(The complete Module)(The compctl Module)(The clone Module)(Zsh Modules)
texinode(The complete Module)(The compctl Module)(The zutil Module)(Zsh Modules)
sect(The complete Module)
The tt(complete) module makes available several builtin commands which
can be used in user-defined completion widgets, see

View file

@ -6,8 +6,7 @@ some of the completion functions in the shell function based
completions system (see
ifzman(zmanref(zshcompsys))\
ifnzman(noderef(Completion System))
). Except for tt(compquote) and tt(compdisplay) these builtin
commands are very
). Except for tt(compquote) these builtin commands are very
specialised and thus not very interesting when writing your own
completion functions. In short, these builtin commands are:
@ -24,22 +23,6 @@ innermost quoting level.
The return value is non-zero in case of an error and zero otherwise.
)
item(tt(compfmt) var(name) var(string) var(defs) ...)(
The var(defs) ar of the form `var(char)tt(;)var(string)' and
tt(compfmt) will replace every occurance of the sequence
`tt(%)var(char)' for each of the var(char)s with the corresponding
var(string). The resulting string will be placed in the parameter
var(name).
)
item(tt(compdisplay) var(name) var(string) var(defs) ...)(
The var(defs) are strings which should be of the form
`var(str)tt(:)var(descr)' (the intended use is that the var(descr)
describes the var(str)) and tt(compdisplay) will convert them to
strings in which the colon is replaced by the var(string) given as the
second argument and spaces are inserted before that so that they are
aligned over all strings. These resultings strings are then assigned
to an array with the var(name) given as the first argument.
)
item(tt(compdescribe))(
This is used by the tt(_describe) function to build the displays for
the matches and to get the strings to add as matches with their
@ -68,9 +51,6 @@ to access the state information to decide what should be completed.
item(tt(compvalues))(
Like tt(comparguments), but for the tt(_values) function.
)
item(tt(compstyle))(
This builtin implements the internals of the style mechanism.
)
item(tt(comptags), tt(comptry))(
This implements the internals of the tags mechanism.
)

109
Doc/Zsh/mod_zutil.yo Normal file
View file

@ -0,0 +1,109 @@
texinode(The zutil Module)(The complete Module)(The clone Module)(Zsh Modules)
sect(The zutil Module)
cindex(builtins, utility)
The tt(zutil) module only adds some builtins:
startitem()
xitem(tt(zstyle) [ tt(-L) ])
xitem(tt(zstyle) [ tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)
xitem(tt(zstyle -d) [ var(pattern) [ var(styles) ... ] ])
xitem(tt(zstyle -g) var(name) [ var(pattern) [ var(style) ] ])
xitem(tt(zstyle -s) var(context) var(style) var(name) [ var(sep) ])
xitem(tt(zstyle -b) var(context) var(style) var(name))
xitem(tt(zstyle -a) var(context) var(style) var(name))
xitem(tt(zstyle -h) var(context) var(style) var(name))
xitem(tt(zstyle -t) var(context) var(style) [ var(strings) ...])
item(tt(zstyle -m) var(context) var(style) var(pattern))(
This builtin command is used to define and lookup styles. Styles are
pairs of names and values, where the values consist of any number of
strings. They are stored together with patterns and lookup is done by
giving a string, called the `context', which is compared to the
patterns. The definition stored for the first matching pattern will be
returned. For this, the patterns are ordered from most specific to
less specific and patterns that are equally specific keep the order in
which they were defined. A pattern is considered to be more specific
than another if it contains more components (substrings separated by
colons) or if the patterns for the components are more specific, where
simple strings are considered to be more specific than patterns and
complex patterns are considered to be more specific than the pattern
`tt(*)'.
The first form (without arguments) lists the definitions in the order
tt(zstyle) will test them. If the tt(-L) option is given, listing is
done in the form of calls to tt(zstyle).
In the second form this defines the given var(style) for the
var(pattern) with the var(strings) as the value.
The third form can be used to delete such definitions. Without
arguments all definitions are deleted, with a var(pattern) all
definitions for that pattern are deleted and if any var(styles) are
given, then only those styles are deleted for the var(pattern).
The fourth form allows to retrieve definitions. The var(name) will be
used as the name of an array in which the results are stored. Without
any further arguments, all var(patterns) defined are returned. With a
var(pattern) the styles defined for that pattern are returned and with
both a var(pattern) and a var(style), the value strings of that
combination is returned.
The other forms can be used to look up or test patterns. With the
tt(-s) option, the value of the style is returned as a string in the
parameter var(name). For this, the strings from the value are
concatenated with spaces (or the var(sep) string if that is given)
between them. The tt(-b) option makes the value be returned as a
boolean, i.e. as the string tt(yes) if the value has only one string
and that is equal to one of tt(yes), tt(true), tt(on), or tt(1). If
the value has more than one string or only one but that is different
from the strings mentioned, the parameter will be set to tt(no). The
tt(-a) option makes the value be returned as an array and the tt(-h)
makes it be returned as an associative array (with the first, third,
etc. string being used as the keys and the other strings being used as
the values).
The tt(-t) option can be used to test the value of a style, i.e. it
only sets the return value. Without any var(strings) arguments it is
zero if the style is defined for at least one matching pattern, has
only one string in its value and that is equal to one of tt(true),
tt(yes), tt(on) or tt(1). If any var(strings) are given the return
zero if and only if at least one of the var(strings) is equal to at
least one of the strings in the value.
The tt(-m) option can be used to match a value. It returns zero if the
var(pattern) matches at least one of the strings in the value.
)
xitem(tt(zformat -f) var(param) var(format) var(specs) ...)
item(tt(zformat -a) var(array) var(sep) var(specs) ...)(
This builtin provides to different forms of formatting. The first form
is selected with the tt(-f) option. If this is given, the var(format)
string will be modified by replacing sequences starting with a percent
sign in it with strings from the var(specs). Each var(spec) has to be
of the form `var(char)tt(:)var(string)' and this will make every
appearence of the sequence `tt(%)var(char)' in var(format) be replaced
with the var(string). The `tt(%)' sequence may also contain optional
minimum and maximum field width specifications between the `tt(%)' and
the `var(char)' in the form `tt(%)var(min)tt(.)var(max)tt(c)',
i.e. the minimum field width is given first and if the maximum field
width is used, it has to be preceded by a dot. Giving a minimum field
width makes the result be padded with spaces to the right if the
var(string) is shorter than the requested width. Padding to the left
can be achieved by giving a negative minimum field width. If a maximum
field width is given, the var(string) will be truncated after that
many characters. After all `tt(%)' sequences for the given var(specs)
have been processed, the resulting string is stored in the parameter
var(param).
The second form, using the tt(-a) option, can be used to get aligned
strings. Here, the var(specs) are of the form
`var(left)tt(:)var(right)' where `var(left)' and `var(right)' are
arbitrary strings. These strings are modified by replacing the colons
with the var(sep) string and padding the var(left) strings with spaces
to the right so that the var(sep) strings in the result (and hence the
var(right) strings after them) are all aligned if the strings are
printed below each other. All strings without a colon are left
unchanged and all strings with a empty var(right) string have the
trailing colon removed. In both cases the lengths of the strings
are not used to determine how the other strings have to be aligned.
The resulting strings are stored in the var(array).
)
enditem()

View file

@ -15,6 +15,10 @@ Builtins for manipulating POSIX.1e (POSIX.6) capability (privilege) sets.
item(tt(clone))(
A builtin that can clone a running shell onto another terminal.
)
item(tt(zutil))(
Some utility builtins, e.g. the one for supporting configuration via
styles.
)
item(tt(complete))(
The basic completion code.
)
@ -66,6 +70,7 @@ enditem()
startmenu()
menu(The cap Module)
menu(The clone Module)
menu(The zutil Module)
menu(The complete Module)
menu(The compctl Module)
menu(The complist Module)
@ -84,6 +89,7 @@ menu(The zleparameter Module)
endmenu()
includefile(Zsh/mod_cap.yo)
includefile(Zsh/mod_clone.yo)
includefile(Zsh/mod_zutil.yo)
includefile(Zsh/mod_complete.yo)
includefile(Zsh/mod_compctl.yo)
includefile(Zsh/mod_complist.yo)

View file

@ -187,40 +187,48 @@ Styles
Users can associate patterns for hierarchical context names with
certain styles using the `compstyle' function. The completion code
should then use these styles to decide how matches should be added and
to get user-configured values. This is done using the function
`_style'.
to get user-configured values. This is done using the builtin `zstyle'.
Basically styles map names to a bunch of strings (the `value'). In
many cases you want to treat the value as a boolean, so let's start
with that. To test if, for example, the style `verbose' is set for
the tag `options' in the context you are currently in, you can just do:
if _style options verbose; then
if zstyle -t ":completion${curcontext}:options" verbose; then
# yes, it is set...
fi
I.e. with two arguments `_style' takes the first one as a tag and the
second one as a style name and returns zero if that style has the
boolean value `true'. Internally it checks if the style is set to one
of `yes', `true', `on', or `1' and interprets that as `true' and every
other value as `false'.
I.e. with the -t option and two arguments `zstyle' takes the first one
as a tag and the second one as a style name and returns zero if that
style has the boolean value `true'. Internally it checks if the style
is set to one of `yes', `true', `on', or `1' and interprets that as
`true' and every other value as `false'.
For more complicated style for which you want to test if the value
matches a certain pattern, you can use `_style' with three arguments:
matches a certain pattern, you can use `zstyle' with the -m option and
three arguments:
if _style foo bar '*baz*'; then
if zstyle -m ":completion${curcontext}:foo" bar '*baz*'; then
...
fi
This tests if the value of the style `bar' for the tag `foo' matches
the pattern `*baz*' and returns zero if it does.
If you just want to see if one of the strings in the value is exactly
equal to any of a number of a strings, you can use the -t option and
give the strings after the style name:
if zstyle -t ":completion${curcontext}:foo" bar str1 str2; then
...
fi
But sometimes you want to actually get the value stored for a certain
style instead of just testing it. For this `_style' supports four
style instead of just testing it. For this `zstyle' supports four
options: `-b', `-s', `-a', and `-h'. After these options, three
arguments are expected, namely the tag, the style, and a parameter
name. The parameter will then be set to the value of the style and the
option says how the strings stored as a value will be stored in the
arguments are expected, the tag, the style, and a parameter name. The
parameter will then be set to the value of the style and the option
says how the strings stored as a value will be stored in the
parameter:
- `-b': the parameter will be set to a either `yes' or `no'
@ -232,13 +240,6 @@ parameter:
from the value being interpreted alternatingly as keys and
values
Note that if you want to test or get styles for a certain context
name which you have to build yourself, you have to call `_style' after
the call to `_tags', `_wanted', or whatever. When you are using
utility functions like `_alternate' or `_arguments' the context will
automatically be set up appropriately at the time when you have a
chance to call `_style'.
Some random comments about style names. Use the ones already in use if
possible. Especially, use the `verbose' style if you can add
matches in a simple and a verbose way. Use the verbose form only if
@ -249,15 +250,11 @@ one says if the user has to give the prefix on the line to make these
matches be added and the second one says if the prefix should be
visible in the list.
But, I think, using any number of new style names is ok -- different
from tag-names where I would like to keep the number of names used
small.
And finally, if you need a style whose value can sensibly be
interpreted as a list of words, use array or association styles with
the `-a' or `-h' options to `_style'. Otherwise you should only make
the `-a' or `-h' options to `zstyle'. Otherwise you should only make
sure that an empty value for a style is treated in the same way as if
the style wasn't set at all (this is use elsewhere and we want to
the style wasn't set at all (this is used elsewhere and we want to
keep things consistent).

View file

@ -51,8 +51,8 @@ incremental-complete-word() {
word="${_lastcomp[unambiguous]}"
state=''
fi
compfmt pstr "$pmpt" "u:${word}" "s:$state" "n:$num" "a:$alt" \
"l:$toolong" "c:${_lastcomp[completer][2,-1]}"
zformat -f pstr "$pmpt" "u:${word}" "s:$state" "n:$num" "a:$alt" \
"l:$toolong" "c:${_lastcomp[completer][2,-1]}"
zle -R "$pstr"
read -k key
@ -99,8 +99,8 @@ incremental-complete-word() {
word="${_lastcomp[unambiguous]}"
state=''
fi
compfmt pstr "$pmpt" "u:${word}" "s:$state" "n:$num" "a:$alt" \
"l:$toolong" "c:${_lastcomp[completer][2,-1]}"
zformat -f pstr "$pmpt" "u:${word}" "s:$state" "n:$num" "a:$alt" \
"l:$toolong" "c:${_lastcomp[completer][2,-1]}"
zle -R "$pstr"
read -k key
done

761
Src/Modules/zutil.c Normal file
View file

@ -0,0 +1,761 @@
/*
* zutil.c - misc utilities
*
* This file is part of zsh, the Z shell.
*
* Copyright (c) 1999 Sven Wischnowsky
* All rights reserved.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and to distribute modified versions of this software for any
* purpose, provided that the above copyright notice and the following
* two paragraphs appear in all copies of this software.
*
* In no event shall Sven Wischnowsky or the Zsh Development Group be liable
* to any party for direct, indirect, special, incidental, or consequential
* damages arising out of the use of this software and its documentation,
* even if Sven Wischnowsky and the Zsh Development Group have been advised of
* the possibility of such damage.
*
* Sven Wischnowsky and the Zsh Development Group specifically disclaim any
* warranties, including, but not limited to, the implied warranties of
* merchantability and fitness for a particular purpose. The software
* provided hereunder is on an "as is" basis, and Sven Wischnowsky and the
* Zsh Development Group have no obligation to provide maintenance,
* support, updates, enhancements, or modifications.
*
*/
#include "zutil.mdh"
#include "zutil.pro"
/* Style stuff. */
typedef struct stypat *Stypat;
typedef struct style *Style;
/* A pattern and the styles for it. */
struct stypat {
Stypat next;
char *pat; /* pattern string */
Patprog prog; /* compiled pattern */
int weight; /* how specific is the pattern? */
Style styles, lstyles; /* first/last style */
};
struct style {
Style next;
char *name;
char **vals;
};
/* List of styles. */
static Stypat zstyles, lzstyles;
/* Memory stuff. */
static void
freestyle(Style s)
{
Style n;
while (s) {
n = s->next;
zsfree(s->name);
if (s->vals)
freearray(s->vals);
zfree(s, sizeof(*s));
s = n;
}
}
static void
freestypat(Stypat p)
{
Stypat n;
while (p) {
n = p->next;
zsfree(p->pat);
freepatprog(p->prog);
zfree(p, sizeof(*p));
p = n;
}
}
/* Get the struct for a pattern, if any. */
static Stypat
getstypat(char *pat)
{
Stypat p;
for (p = zstyles; p; p = p->next)
if (!strcmp(pat, p->pat))
return p;
return NULL;
}
/* Get the style stuff for a name. */
static Style
getstyle(Stypat p, char *name)
{
Style s;
for (s = p->styles; s; s= s->next)
if (!strcmp(name, s->name))
return s;
return NULL;
}
/* Store a value for a style. */
static void
setstyle(Stypat p, char *name, char **vals)
{
Style s;
for (s = p->styles; s; s = s->next)
if (!strcmp(name, s->name)) {
/* Exists -> replace. */
if (s->vals)
freearray(s->vals);
PERMALLOC {
s->vals = arrdup(vals);
} LASTALLOC;
return;
}
/* New style. */
s = (Style) zalloc(sizeof(*s));
s->name = ztrdup(name);
PERMALLOC {
s->vals = arrdup(vals);
} LASTALLOC;
s->next = NULL;
if (p->lstyles)
p->lstyles->next = s;
else
p->styles = s;
p->lstyles = s;
}
/* Add a new pattern. */
static Stypat
addstypat(char *pat, Patprog prog)
{
Stypat p, q, qq;
int weight, tmp, first;
char *s;
/* Calculate the weight. */
for (weight = 0, tmp = 2, first = 1, s = pat; *s; s++) {
if (first && *s == '*' && (!s[1] || s[1] == ':')) {
/* Only `*' in this component. */
tmp = 0;
continue;
}
first = 0;
if (*s == '(' || *s == '|' || *s == '*' || *s == '[' || *s == '<' ||
*s == '?' || *s == '#' || *s == '^')
/* Is pattern. */
tmp = 1;
if (*s == ':') {
/* Yet another component. */
first = 1;
weight += tmp;
tmp = 2;
}
}
weight += tmp;
p = (Stypat) zalloc(sizeof(*p));
p->pat = ztrdup(pat);
p->weight = weight;
p->prog = prog;
p->styles = p->lstyles = NULL;
for (qq = NULL, q = zstyles; q && q->weight >= weight;
qq = q, q = q->next);
p->next = q;
if (qq)
qq->next = p;
else
zstyles = p;
if (!q)
lzstyles = p;
return p;
}
/* Delete a style. */
static void
deletestyle(Stypat p, char *name)
{
Style ps, s;
for (ps = NULL, s = p->styles; s; ps = s, s = s->next)
if (!strcmp(name, s->name)) {
if (ps)
ps->next = s->next;
else
p->styles = s->next;
if (s == p->lstyles)
p->lstyles = ps;
s->next = NULL;
freestyle(s);
return;
}
}
/* Delete a whole pattern with all its styles. */
static void
deletestypat(Stypat pat)
{
Stypat pp, p;
for (pp = NULL, p = zstyles; p; pp = p, p = p->next)
if (p == pat) {
if (pp)
pp->next = p->next;
else
zstyles = p->next;
if (p == lzstyles)
lzstyles = pp;
p->next = NULL;
zsfree(p->pat);
freepatprog(p->prog);
freestyle(p->styles);
zfree(p, sizeof(*p));
return;
}
}
/* Look up a style for a context pattern. This does the matching. */
static Style
lookupstyle(char *ctxt, char *style)
{
Stypat p;
Style s;
for (p = zstyles; p; p = p->next)
if (pattry(p->prog, ctxt))
for (s = p->styles; s; s = s->next)
if (!strcmp(style, s->name))
return s;
return NULL;
}
static int
bin_zstyle(char *nam, char **args, char *ops, int func)
{
int min, max, n, add = 0, list = 0;
if (!args[0])
list = 1;
else if (args[0][0] == '-') {
char oc;
if ((oc = args[0][1]) && oc != '-') {
if (args[0][2]) {
zerrnam(nam, "invalid argument: %s", args[0], 0);
return 1;
}
if (oc == 'L')
list = 2;
} else {
add = 1;
args++;
}
} else
add = 1;
if (add) {
Stypat p;
if (arrlen(args) < 2) {
zerrnam(nam, "not enough arguments", NULL, 0);
return 1;
}
if (!(p = getstypat(args[0]))) {
Patprog prog;
char *pat = dupstring(args[0]);
tokenize(pat);
if (!(prog = patcompile(pat, PAT_ZDUP, NULL))) {
zerrnam(nam, "invalid pattern: %s", args[0], 0);
return 1;
}
p = addstypat(args[0], prog);
}
setstyle(p, args[1], args + 2);
return 0;
}
if (list) {
Stypat p;
Style s;
char **v;
for (p = zstyles; p; p = p->next) {
if (list == 1) {
quotedzputs(p->pat, stdout);
putchar('\n');
}
for (s = p->styles; s; s = s->next) {
if (list == 1)
printf(" %s", s->name);
else {
printf("zstyle ");
quotedzputs(p->pat, stdout);
printf(" %s", s->name);
}
for (v = s->vals; *v; v++) {
putchar(' ');
quotedzputs(*v, stdout);
}
putchar('\n');
}
}
return 0;
}
switch (args[0][1]) {
case 'd': min = 0; max = -1; break;
case 's': min = 3; max = 4; break;
case 'b': min = 3; max = 3; break;
case 'a': min = 3; max = 3; break;
case 'h': min = 3; max = 3; break;
case 't': min = 2; max = -1; break;
case 'm': min = 3; max = 3; break;
case 'g': min = 1; max = 3; break;
default:
zerrnam(nam, "invalid option: %s", args[0], 0);
return 1;
}
n = arrlen(args) - 1;
if (n < min) {
zerrnam(nam, "not enough arguments", NULL, 0);
return 1;
} else if (max >= 0 && n > max) {
zerrnam(nam, "too many arguments", NULL, 0);
return 1;
}
switch (args[0][1]) {
case 'd':
{
Stypat p;
if (args[1]) {
if ((p = getstypat(args[1]))) {
if (args[2]) {
char **ap = args + 2;
while (*ap)
deletestyle(p, *ap++);
if (!p->styles)
deletestypat(p);
} else
deletestypat(p);
}
} else {
freestypat(zstyles);
zstyles = lzstyles = NULL;
}
}
break;
case 's':
{
Style s;
char *ret;
int val;
if ((s = lookupstyle(args[1], args[2])) && s->vals[0]) {
PERMALLOC {
ret = sepjoin(s->vals, (args[4] ? args[4] : " "));
} LASTALLOC;
val = 0;
} else {
ret = ztrdup("");
val = 1;
}
setsparam(args[3], ret);
return val;
}
break;
case 'b':
{
Style s;
char *ret;
int val;
if ((s = lookupstyle(args[1], args[2])) &&
s->vals[0] && !s->vals[1] &&
(!strcmp(s->vals[0], "yes") ||
!strcmp(s->vals[0], "true") ||
!strcmp(s->vals[0], "on") ||
!strcmp(s->vals[0], "1"))) {
ret = "yes";
val = 0;
} else {
ret = "no";
val = 1;
}
setsparam(args[3], ztrdup(ret));
return val;
}
break;
case 'a':
case 'h':
{
Style s;
char **ret;
int val;
if ((s = lookupstyle(args[1], args[2]))) {
PERMALLOC {
ret = arrdup(s->vals);
} LASTALLOC;
val = 0;
} else {
char *dummy = NULL;
PERMALLOC {
ret = arrdup(&dummy);
} LASTALLOC;
val = 1;
}
if (args[0][1] == 'a')
setaparam(args[3], ret);
else
sethparam(args[3], ret);
return val;
}
break;
case 't':
{
Style s;
if ((s = lookupstyle(args[1], args[2])) && s->vals[0]) {
if (args[3]) {
char **ap = args + 3, **p;
while (*ap) {
p = s->vals;
while (*p)
if (!strcmp(*ap, *p++))
return 0;
ap++;
}
return 1;
} else
return !(!strcmp(s->vals[0], "true") ||
!strcmp(s->vals[0], "yes") ||
!strcmp(s->vals[0], "on") ||
!strcmp(s->vals[0], "1"));
}
return 1;
}
break;
case 'm':
{
Style s;
Patprog prog;
tokenize(args[3]);
if ((s = lookupstyle(args[1], args[2])) &&
(prog = patcompile(args[3], PAT_STATIC, NULL))) {
char **p = s->vals;
while (*p)
if (pattry(prog, *p++))
return 0;
}
return 1;
}
break;
case 'g':
{
LinkList l = newlinklist();
int ret = 1;
Stypat p;
if (args[2]) {
if ((p = getstypat(args[2]))) {
Style s;
if (args[3]) {
if ((s = getstyle(p, args[3]))) {
char **v = s->vals;
while (*v)
addlinknode(l, *v++);
ret = 0;
}
} else {
for (s = p->styles; s; s = s->next)
addlinknode(l, s->name);
ret = 0;
}
}
} else {
for (p = zstyles; p; p = p->next)
addlinknode(l, p->pat);
ret = 0;
}
set_list_array(args[1], l);
return ret;
}
}
return 0;
}
/* Format stuff. */
static int
bin_zformat(char *nam, char **args, char *ops, int func)
{
char opt;
if (args[0][0] != '-' || !(opt = args[0][1]) || args[0][2]) {
zerrnam(nam, "invalid argument: %s", args[0], 0);
return 1;
}
args++;
switch (opt) {
case 'f':
{
char **ap, *specs[256], *out, *s;
int olen, oused = 0;
memset(specs, 0, 256 * sizeof(char *));
for (ap = args + 2; *ap; ap++) {
if (!ap[0][0] || ap[0][0] == '-' || ap[0][0] == '.' ||
(ap[0][0] >= '0' && ap[0][0] <= '9') ||
ap[0][1] != ':') {
zerrnam(nam, "invalid argument: %s", *ap, 0);
return 1;
}
specs[STOUC(ap[0][0])] = ap[0] + 2;
}
out = (char *) zhalloc(olen = 128);
for (s = args[1]; *s; s++) {
if (*s == '%') {
int right, min = -1, max = -1, outl;
char *spec, *start = s;
if ((right = (*++s == '-')))
s++;
if (*s >= '0' && *s <= '9') {
for (min = 0; *s >= '0' && *s <= '9'; s++)
min = (min * 10) + (int) STOUC(*s) - '0';
}
if (*s == '.' && s[1] >= '0' && s[1] <= '9') {
for (max = 0, s++; *s >= '0' && *s <= '9'; s++)
max = (max * 10) + (int) STOUC(*s) - '0';
}
if ((spec = specs[STOUC(*s)])) {
int len;
if ((len = strlen(spec)) > max && max >= 0)
len = max;
outl = (min >= 0 ? (min > len ? min : len) : len);
if (oused + outl >= olen) {
int nlen = olen + outl + 128;
char *tmp = (char *) zhalloc(nlen);
memcpy(tmp, out, olen);
olen = nlen;
out = tmp;
}
if (len >= outl) {
memcpy(out + oused, spec, outl);
oused += outl;
} else {
int diff = outl - len;
if (right) {
while (diff--)
out[oused++] = ' ';
memcpy(out + oused, spec, len);
oused += len;
} else {
memcpy(out + oused, spec, len);
oused += len;
while (diff--)
out[oused++] = ' ';
}
}
} else {
int len = s - start + 1;
if (oused + len >= olen) {
int nlen = olen + len + 128;
char *tmp = (char *) zhalloc(nlen);
memcpy(tmp, out, olen);
olen = nlen;
out = tmp;
}
memcpy(out + oused, start, len);
oused += len;
}
} else {
if (oused + 1 >= olen) {
char *tmp = (char *) zhalloc(olen << 1);
memcpy(tmp, out, olen);
olen <<= 1;
out = tmp;
}
out[oused++] = *s;
}
}
out[oused] = '\0';
setsparam(args[0], ztrdup(out));
return 0;
}
break;
case 'a':
{
char **ap, *cp;
int nbc = 0, colon = 0, pre = 0, suf = 0;
for (ap = args + 2; *ap; ap++) {
for (nbc = 0, cp = *ap; *cp && *cp != ':'; cp++)
if (*cp == '\\' && cp[1])
cp++, nbc++;
if (*cp == ':' && cp[1]) {
int d;
colon++;
if ((d = cp - *ap - nbc) > pre)
pre = d;
if ((d = strlen(cp + 1)) > suf)
suf = d;
}
}
{
int sl = strlen(args[1]);
VARARR(char, buf, pre + suf + sl + 1);
char **ret, **rp, *copy, *cpp, oldc;
ret = (char **) zalloc((arrlen(args + 2) + 1) *
sizeof(char *));
memcpy(buf + pre, args[1], sl);
suf = pre + sl;
for (rp = ret, ap = args + 2; *ap; ap++) {
copy = dupstring(*ap);
for (cp = cpp = copy; *cp && *cp != ':'; cp++) {
if (*cp == '\\' && cp[1])
cp++;
*cpp++ = *cp;
}
oldc = *cpp;
*cpp = '\0';
if (((cpp == cp && oldc == ':') || *cp == ':') && cp[1]) {
memset(buf, ' ', pre);
memcpy(buf, copy, (cpp - copy));
strcpy(buf + suf, cp + 1);
*rp++ = ztrdup(buf);
} else
*rp++ = ztrdup(copy);
}
*rp = NULL;
setaparam(args[0], ret);
return 0;
}
}
break;
}
zerrnam(nam, "invalid option: -%c", 0, opt);
return 1;
}
static struct builtin bintab[] = {
BUILTIN("zstyle", 0, bin_zstyle, 0, -1, 0, NULL, NULL),
BUILTIN("zformat", 0, bin_zformat, 3, -1, 0, NULL, NULL),
};
/**/
int
setup_zutil(Module m)
{
zstyles = NULL;
return 0;
}
/**/
int
boot_zutil(Module m)
{
return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
}
/**/
int
cleanup_zutil(Module m)
{
deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
return 0;
}
/**/
int
finish_zutil(Module m)
{
freestypat(zstyles);
return 0;
}

3
Src/Modules/zutil.mdd Normal file
View file

@ -0,0 +1,3 @@
objects="zutil.o"
autobins="zformat zstyle"

View file

@ -102,24 +102,6 @@ cdisp_build(Cdisp disp, char *sep, char **args)
return ret;
}
/**/
static int
bin_compdisplay(char *nam, char **args, char *ops, int func)
{
struct cdisp disp;
if (incompfunc != 1) {
zerrnam(nam, "can only be called from completion function", NULL, 0);
return 1;
}
disp.pre = disp.suf = disp.colon = 0;
cdisp_calc(&disp, args + 2);
setaparam(args[0], cdisp_build(&disp, args[1], args + 2));
return !disp.colon;
}
/* Help fuer `_describe'. */
typedef struct cdset *Cdset;
@ -2179,411 +2161,6 @@ bin_compquote(char *nam, char **args, char *ops, int func)
return 0;
}
/* Style stuff. */
typedef struct cspat *Cspat;
typedef struct cstyle *Cstyle;
/* A pattern and the styles for it. */
struct cspat {
Cspat next;
char *pat; /* pattern string */
Patprog prog; /* compiled pattern */
int weight; /* how specific is the pattern? */
Cstyle styles, lstyles; /* first/last style */
};
struct cstyle {
Cstyle next;
char *name;
char **vals;
};
/* List of styles. */
static Cspat compstyles, lcompstyles;
/* Memory stuff. */
static void
freecstyle(Cstyle s)
{
Cstyle n;
while (s) {
n = s->next;
zsfree(s->name);
if (s->vals)
freearray(s->vals);
zfree(s, sizeof(*s));
s = n;
}
}
static void
freecspat(Cspat p)
{
Cspat n;
while (p) {
n = p->next;
zsfree(p->pat);
freepatprog(p->prog);
zfree(p, sizeof(*p));
p = n;
}
}
/* Get the struct for a pattern, if any. */
static Cspat
getcspat(char *pat)
{
Cspat p;
for (p = compstyles; p; p = p->next)
if (!strcmp(pat, p->pat))
return p;
return NULL;
}
/* Get the style stuff for a name. */
static Cstyle
getcstyle(Cspat p, char *name)
{
Cstyle s;
for (s = p->styles; s; s= s->next)
if (!strcmp(name, s->name))
return s;
return NULL;
}
/* Store a value for a style. */
static void
setcstyle(Cspat p, char *name, char **vals)
{
Cstyle s;
for (s = p->styles; s; s = s->next)
if (!strcmp(name, s->name)) {
/* Exists -> replace. */
if (s->vals)
freearray(s->vals);
PERMALLOC {
s->vals = arrdup(vals);
} LASTALLOC;
return;
}
/* New style. */
s = (Cstyle) zalloc(sizeof(*s));
s->name = ztrdup(name);
PERMALLOC {
s->vals = arrdup(vals);
} LASTALLOC;
s->next = NULL;
if (p->lstyles)
p->lstyles->next = s;
else
p->styles = s;
p->lstyles = s;
}
/* Add a new pattern. */
static Cspat
addcspat(char *pat, Patprog prog)
{
Cspat p, q, qq;
int weight, tmp, first;
char *s;
/* Calculate the weight. */
for (weight = 0, tmp = 2, first = 1, s = pat; *s; s++) {
if (first && *s == '*' && (!s[1] || s[1] == ':')) {
/* Only `*' in this component. */
tmp = 0;
continue;
}
first = 0;
if (*s == '(' || *s == '|' || *s == '*' || *s == '[' || *s == '<' ||
*s == '?' || *s == '#' || *s == '^')
/* Is pattern. */
tmp = 1;
if (*s == ':') {
/* Yet another component. */
first = 1;
weight += tmp;
tmp = 2;
}
}
weight += tmp;
p = (Cspat) zalloc(sizeof(*p));
p->pat = ztrdup(pat);
p->weight = weight;
p->prog = prog;
p->styles = p->lstyles = NULL;
for (qq = NULL, q = compstyles; q && q->weight >= weight;
qq = q, q = q->next);
p->next = q;
if (qq)
qq->next = p;
else
compstyles = p;
if (!q)
lcompstyles = p;
return p;
}
/* Delete a style. */
static void
deletecstyle(Cspat p, char *name)
{
Cstyle ps, s;
for (ps = NULL, s = p->styles; s; ps = s, s = s->next)
if (!strcmp(name, s->name)) {
if (ps)
ps->next = s->next;
else
p->styles = s->next;
if (s == p->lstyles)
p->lstyles = ps;
s->next = NULL;
freecstyle(s);
return;
}
}
/* Delete a whole pattern with all its styles. */
static void
deletecspat(Cspat pat)
{
Cspat pp, p;
for (pp = NULL, p = compstyles; p; pp = p, p = p->next)
if (p == pat) {
if (pp)
pp->next = p->next;
else
compstyles = p->next;
if (p == lcompstyles)
lcompstyles = pp;
p->next = NULL;
zsfree(p->pat);
freepatprog(p->prog);
freecstyle(p->styles);
zfree(p, sizeof(*p));
return;
}
}
/* Look up a style for a context pattern. This does the matching. */
static Cstyle
lookupcstyle(char *ctxt, char *style)
{
Cspat p;
Cstyle s;
for (p = compstyles; p; p = p->next)
if (pattry(p->prog, ctxt))
for (s = p->styles; s; s = s->next)
if (!strcmp(style, s->name))
return s;
return NULL;
}
static int
bin_compstyles(char *nam, char **args, char *ops, int func)
{
int min, max, n;
if (args[0][0] != '-' || !args[0][1] || args[0][2]) {
zerrnam(nam, "invalid argument: %s", args[0], 0);
return 1;
}
switch (args[0][1]) {
case 'a': min = 2; max = -1; break;
case 'd': min = 0; max = 2; break;
case 'S': min = 3; max = 3; break;
case 'A': min = 3; max = 3; break;
case 'H': min = 3; max = 3; break;
case 'T': min = 2; max = 2; break;
case 'G': min = 1; max = 3; break;
default:
zerrnam(nam, "invalid option: %s", args[0], 0);
return 1;
}
n = arrlen(args) - 1;
if (n < min) {
zerrnam(nam, "not enough arguments", NULL, 0);
return 1;
} else if (max >= 0 && n > max) {
zerrnam(nam, "too many arguments", NULL, 0);
return 1;
}
switch (args[0][1]) {
case 'a':
{
Cspat p;
if (!(p = getcspat(args[1]))) {
Patprog prog;
char *pat = dupstring(args[1]);
tokenize(pat);
if (!(prog = patcompile(pat, PAT_ZDUP, NULL))) {
zerrnam(nam, "invalid pattern: %s", args[1], 0);
return 1;
}
p = addcspat(args[1], prog);
}
setcstyle(p, args[2], args + 3);
}
break;
case 'd':
{
Cspat p;
if (args[1]) {
if ((p = getcspat(args[1]))) {
if (args[2]) {
deletecstyle(p, args[2]);
if (!p->styles)
deletecspat(p);
} else
deletecspat(p);
}
} else {
freecspat(compstyles);
compstyles = lcompstyles = NULL;
}
}
break;
case 'S':
{
Cstyle s;
char *ret;
int val;
if ((s = lookupcstyle(args[1], args[2])) && s->vals[0]) {
PERMALLOC {
ret = sepjoin(s->vals, NULL);
} LASTALLOC;
val = 0;
} else {
ret = ztrdup("");
val = 1;
}
setsparam(args[3], ret);
return val;
}
break;
case 'A':
case 'H':
{
Cstyle s;
char **ret;
int val;
if ((s = lookupcstyle(args[1], args[2]))) {
PERMALLOC {
ret = arrdup(s->vals);
} LASTALLOC;
val = 0;
} else {
char *dummy = NULL;
PERMALLOC {
ret = arrdup(&dummy);
} LASTALLOC;
val = 1;
}
if (args[0][1] == 'A')
setaparam(args[3], ret);
else
sethparam(args[3], ret);
return val;
}
break;
case 'T':
return !lookupcstyle(args[1], args[2]);
case 'G':
{
LinkList l = newlinklist();
int ret = 1;
Cspat p;
if (args[2]) {
if ((p = getcspat(args[2]))) {
Cstyle s;
if (args[3]) {
if ((s = getcstyle(p, args[3]))) {
char **v = s->vals;
while (*v)
addlinknode(l, *v++);
ret = 0;
}
} else {
for (s = p->styles; s; s = s->next)
addlinknode(l, s->name);
ret = 0;
}
}
} else {
for (p = compstyles; p; p = p->next)
addlinknode(l, p->pat);
ret = 0;
}
set_list_array(args[1], l);
return ret;
}
}
return 0;
}
/* Tags stuff. */
typedef struct ctags *Ctags;
@ -2855,12 +2432,10 @@ bin_compfmt(char *nam, char **args, char *ops, int func)
}
static struct builtin bintab[] = {
BUILTIN("compdisplay", 0, bin_compdisplay, 2, -1, 0, NULL, NULL),
BUILTIN("compdescribe", 0, bin_compdescribe, 3, -1, 0, NULL, NULL),
BUILTIN("comparguments", 0, bin_comparguments, 1, -1, 0, NULL, NULL),
BUILTIN("compvalues", 0, bin_compvalues, 1, -1, 0, NULL, NULL),
BUILTIN("compquote", 0, bin_compquote, 1, -1, 0, NULL, NULL),
BUILTIN("compstyles", 0, bin_compstyles, 1, -1, 0, NULL, NULL),
BUILTIN("comptags", 0, bin_comptags, 1, -1, 0, NULL, NULL),
BUILTIN("comptry", 0, bin_comptry, 0, -1, 0, NULL, NULL),
BUILTIN("compfmt", 0, bin_compfmt, 2, -1, 0, NULL, NULL),
@ -2874,8 +2449,6 @@ setup_computil(Module m)
memset(cadef_cache, 0, sizeof(cadef_cache));
memset(cvdef_cache, 0, sizeof(cvdef_cache));
compstyles = NULL;
memset(comptags, 0, sizeof(comptags));
lasttaglevel = 0;
@ -2909,8 +2482,6 @@ finish_computil(Module m)
for (i = 0; i < MAX_CVCACHE; i++)
freecvdef(cvdef_cache[i]);
freecspat(compstyles);
for (i = 0; i < MAX_TAGS; i++)
freectags(comptags[i]);

View file

@ -2,4 +2,4 @@ moddeps="complete zle"
objects="computil.o"
autobins="compdisplay compdescribe comparguments compvalues compquote compstyles comptags comptry"
autobins="compdescribe comparguments compvalues compquote comptags comptry"

View file

@ -4,6 +4,7 @@ complete
compctl
sched
complist
zutil
computil
parameter
zleparameter