1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 10:41:11 +02:00

zsh-workers/9546

This commit is contained in:
Tanaka Akira 2000-02-03 17:22:40 +00:00
parent 52a67fbbda
commit ed41dafd3c
53 changed files with 325 additions and 259 deletions

View file

@ -162,7 +162,7 @@ while [[ "$1" = -(O*|C) ]]; do
esac esac
done done
zstyle -s ":completion${curcontext}:options" auto-description autod zstyle -s ":completion:${curcontext}:options" auto-description autod
if (( $# )) && comparguments -i "$autod" "$@"; then if (( $# )) && comparguments -i "$autod" "$@"; then
local nm="$compstate[nmatches]" action noargs aret expl local local nm="$compstate[nmatches]" action noargs aret expl local
@ -172,7 +172,7 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
if comparguments -D descr action; then if comparguments -D descr action; then
comparguments -C subc comparguments -C subc
curcontext="${oldcontext}:$subc" curcontext="${oldcontext%:*}:$subc"
if comparguments -O next direct odirect equal; then if comparguments -O next direct odirect equal; then
opts=yes opts=yes
@ -201,7 +201,7 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
comparguments -W line opt_args comparguments -W line opt_args
state="${${action[3,-1]##[ ]#}%%[ ]#}" state="${${action[3,-1]##[ ]#}%%[ ]#}"
if [[ -n "$usecc" ]]; then if [[ -n "$usecc" ]]; then
curcontext="${oldcontext}:$subc" curcontext="${oldcontext%:*}:$subc"
else else
context="$subc" context="$subc"
fi fi
@ -259,7 +259,7 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
fi fi
if [[ -z "$matched$mesg" ]] && _requested options && if [[ -z "$matched$mesg" ]] && _requested options &&
{ ! zstyle -t ":completion${curcontext}:options" prefix-needed || { ! zstyle -t ":completion:${curcontext}:options" prefix-needed ||
[[ "$origpre" = [-+]* || [[ "$origpre" = [-+]* ||
( -z "$aret$mesg" && nm -eq compstate[nmatches] ) ]] } ; then ( -z "$aret$mesg" && nm -eq compstate[nmatches] ) ]] } ; then
local prevpre="$PREFIX" previpre="$IPREFIX" local prevpre="$PREFIX" previpre="$IPREFIX"
@ -320,7 +320,7 @@ if (( $# )) && comparguments -i "$autod" "$@"; then
matched=yes matched=yes
comparguments -L "${equal[1]%%:*}" descr action subc comparguments -L "${equal[1]%%:*}" descr action subc
curcontext="${oldcontext}:$subc" curcontext="${oldcontext%:*}:$subc"
_tags arguments _tags arguments

View file

@ -11,7 +11,7 @@
# Assume an user sets the style `hosts-ports-users' as for the my-accounts # Assume an user sets the style `hosts-ports-users' as for the my-accounts
# tag: # tag:
# #
# zstyle ':completion:*:telnet*:my-accounts' hosts-ports-users \ # zstyle ':completion:*:*:telnet:*:my-accounts' hosts-ports-users \
# host0:: host1::user1 host2::user2 # host0:: host1::user1 host2::user2
# mail-server:{smtp,pop3}: # mail-server:{smtp,pop3}:
# news-server:nntp: # news-server:nntp:
@ -78,7 +78,7 @@ key="${1%:*}"
num="${${1##*:}:-1}" num="${${1##*:}:-1}"
shift shift
if zstyle -a ":completion${curcontext}:$tag" "$style" tmp; then if zstyle -a ":completion:${curcontext}:$tag" "$style" tmp; then
eval "tmp=( \"\${(@M)tmp:#\${(j($sep))~pats}}\" )" eval "tmp=( \"\${(@M)tmp:#\${(j($sep))~pats}}\" )"
if (( keys[(in:num:)$key] != 1 )); then if (( keys[(in:num:)$key] != 1 )); then
eval "tmp=( \${tmp#\${(j(${sep}))~\${(@)\${(@)keys[2,(rn:num:)\$key]}/*/*}}$sep} )" eval "tmp=( \${tmp#\${(j(${sep}))~\${(@)\${(@)keys[2,(rn:num:)\$key]}/*/*}}$sep} )"

View file

@ -16,7 +16,7 @@ fi
_tags "$_type" || return 1 _tags "$_type" || return 1
zstyle -t ":completion${curcontext}:$_type" verbose && _showd=yes zstyle -t ":completion:${curcontext}:$_type" verbose && _showd=yes
_description "$_type" _expl "$1" _description "$_type" _expl "$1"
shift shift
@ -28,7 +28,7 @@ else
fi fi
[[ "$_type" = options ]] && [[ "$_type" = options ]] &&
zstyle -t ":completion${curcontext}:options" prefix-hidden && _hide=yes zstyle -t ":completion:${curcontext}:options" prefix-hidden && _hide=yes
while compdescribe -g _args _tmpd _tmpmd _tmps _tmpms; do 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 # # We first search in the last ten words, then in the last
# # twenty words, and so on... # # twenty words, and so on...
# while [[ i -le max ]]; do # while [[ i -le max ]]; do
# if zstyle -t ":completion${curcontext}:history-words" sort; then # if zstyle -t ":completion:${curcontext}:history-words" sort; then
# _description history-words expl "history ($n)" # _description history-words expl "history ($n)"
# else # else
# _description -V history-words expl "history ($n)" # _description -V history-words expl "history ($n)"

View file

@ -5,12 +5,12 @@ local expl disp jobs job jids pfx='%' desc how
_tags jobs || return 1 _tags jobs || return 1
if [[ "$1" = -t ]]; then if [[ "$1" = -t ]]; then
zstyle -t ":completion${curcontext}:jobs" prefix-needed && zstyle -t ":completion:${curcontext}:jobs" prefix-needed &&
[[ "$PREFIX" != %* && compstate[nmatches] -ne 0 ]] && return 1 [[ "$PREFIX" != %* && compstate[nmatches] -ne 0 ]] && return 1
shift shift
fi fi
zstyle -t ":completion${curcontext}:jobs" prefix-hidden && pfx='' zstyle -t ":completion:${curcontext}:jobs" prefix-hidden && pfx=''
zstyle -t ":completion${curcontext}:jobs" verbose && desc=yes zstyle -t ":completion:${curcontext}:jobs" verbose && desc=yes
if [[ "$1" = -r ]]; then if [[ "$1" = -r ]]; then
jids=( "${(@k)jobstates[(R)running*]}" ) jids=( "${(@k)jobstates[(R)running*]}" )
@ -34,7 +34,7 @@ if [[ -n "$desc" ]]; then
done done
fi fi
zstyle -s ":completion${curcontext}:jobs" numbers how zstyle -s ":completion:${curcontext}:jobs" numbers how
if [[ "$how" = (yes|true|on|1) ]]; then if [[ "$how" = (yes|true|on|1) ]]; then
jobs=( "$jids[@]" ) jobs=( "$jids[@]" )

View file

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

View file

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

View file

@ -20,7 +20,7 @@ if compvalues -i "$@"; then
_tags values || return 1 _tags values || return 1
curcontext="${oldcontext}:values" curcontext="${oldcontext%:*}:values"
compvalues -V noargs args opts compvalues -V noargs args opts
@ -47,7 +47,7 @@ if compvalues -i "$@"; then
SUFFIX="$suffix" SUFFIX="$suffix"
IPREFIX="${IPREFIX}${args[1]%%:*}=" IPREFIX="${IPREFIX}${args[1]%%:*}="
compvalues -L "${args[1]%%:*}" descr action subc compvalues -L "${args[1]%%:*}" descr action subc
curcontext="${oldcontext}:$subc" curcontext="${oldcontext%:*}:$subc"
fi fi
else else
compvalues -d descr compvalues -d descr
@ -68,7 +68,7 @@ if compvalues -i "$@"; then
fi fi
else else
compvalues -C subc compvalues -C subc
curcontext="${oldcontext}:$subc" curcontext="${oldcontext%:*}:$subc"
fi fi
if ! _tags arguments; then if ! _tags arguments; then
@ -88,7 +88,7 @@ if compvalues -i "$@"; then
compvalues -v val_args compvalues -v val_args
state="${${action[3,-1]##[ ]#}%%[ ]#}" state="${${action[3,-1]##[ ]#}%%[ ]#}"
if [[ -n "$usecc" ]]; then if [[ -n "$usecc" ]]; then
curcontext="$subc" curcontext="${oldcontext%:*}:$subc"
else else
context="$subc" context="$subc"
fi fi

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -9,7 +9,7 @@
# Don't try any more completion after this. # Don't try any more completion after this.
_compskip=all _compskip=all
local subcom expl local subcom expl curcontext="${curcontext}"
if [[ $words[1] = zftp ]]; then if [[ $words[1] = zftp ]]; then
if [[ $CURRENT -eq 2 ]]; then if [[ $CURRENT -eq 2 ]]; then
@ -20,6 +20,7 @@ if [[ $words[1] = zftp ]]; then
return return
fi fi
subcom=$words[2] subcom=$words[2]
curcontext="${curcontext/:zftp:/:zftp-${words[2]}:}"
else else
subcom=$words[1] subcom=$words[1]
fi fi
@ -27,27 +28,27 @@ fi
case $subcom in case $subcom in
*(cd|ls|dir)) *(cd|ls|dir))
# complete remote directories # complete remote directories
_tags -C "$subcom" directories && zfcd_match $PREFIX $SUFFIX _tags directories && zfcd_match $PREFIX $SUFFIX
;; ;;
*(get(|at)|gcp|delete|remote)) *(get(|at)|gcp|delete|remote))
# complete remote files # complete remote files
_tags -C "$subcom" files && zfget_match $PREFIX $SUFFIX _tags files && zfget_match $PREFIX $SUFFIX
;; ;;
*(put(|at)|pcp)) *(put(|at)|pcp))
# complete local files # complete local files
_tags -C "$subcom" files && _files _tags files && _files
;; ;;
*(open|anon|params)) *(open|anon|params))
# complete hosts: should do cleverer stuff with user names # complete hosts: should do cleverer stuff with user names
_tags -C "$subcom" hosts && _hosts _tags hosts && _hosts
;; ;;
*(goto|mark)) *(goto|mark))
# complete bookmarks. First decide if ncftp mode is go. # complete bookmarks. First decide if ncftp mode is go.
_wanted -C "$subcom" bookmarks expl bookmark || return 1 _wanted bookmarks expl bookmark || return 1
if [[ $words[2] = -*n* ]]; then if [[ $words[2] = -*n* ]]; then
if [[ -f ~/.ncftp/bookmarks ]]; then if [[ -f ~/.ncftp/bookmarks ]]; then
compadd "$expl[@]" - $(awk -F, 'NR > 2 { print $1 }' ~/.ncftp/bookmarks) compadd "$expl[@]" - $(awk -F, 'NR > 2 { print $1 }' ~/.ncftp/bookmarks)
@ -61,7 +62,7 @@ case $subcom in
*session) *session)
# complete sessions, excluding the current one. # complete sessions, excluding the current one.
_wanted -C "$subcom" sessions expl 'another FTP session' && _wanted sessions expl 'another FTP session' &&
compadd "$expl[@]" - ${$(zftp session):#$ZFTP_SESSION} compadd "$expl[@]" - ${$(zftp session):#$ZFTP_SESSION}
;; ;;
@ -69,7 +70,7 @@ case $subcom in
# complete arguments like sess1:file1 sess2:file2 # complete arguments like sess1:file1 sess2:file2
if [[ $PREFIX = *:* ]]; then if [[ $PREFIX = *:* ]]; then
# complete file in the given session # complete file in the given session
_tags -C "$subcom" files || return 1 _tags files || return 1
local sess=${PREFIX%%:*} oldsess=$ZFTP_SESSION local sess=${PREFIX%%:*} oldsess=$ZFTP_SESSION
compset -p $(( $#sess + 1 )) compset -p $(( $#sess + 1 ))
[[ -n $sess ]] && zftp session $sess [[ -n $sess ]] && zftp session $sess
@ -77,7 +78,7 @@ case $subcom in
[[ -n $sess && -n $oldsess ]] && zftp session $oldsess [[ -n $sess && -n $oldsess ]] && zftp session $oldsess
else else
# note here we can complete the current session # note here we can complete the current session
_wanted -C "$subcom" sessions expl 'FTP session' && _wanted sessions expl 'FTP session' &&
compadd "$expl[@]" -S : - $(zftp session) compadd "$expl[@]" -S : - $(zftp session)
fi fi
;; ;;

View file

@ -1,7 +1,7 @@
#compdef zstyle #compdef zstyle
local curcontext="$curcontext" state context ostate line expl ctop local curcontext="$curcontext" state context ostate line expl ctop
local nm=$compstate[nmatches] local nm=$compstate[nmatches] mesg
typeset -A opt_args typeset -A opt_args
typeset -A styles typeset -A styles
@ -17,6 +17,7 @@ styles=(
condition c: condition c:
cursor c:bool cursor c:bool
disable-stat c:bool disable-stat c:bool
domains c:
expand c: expand c:
file-patterns c: file-patterns c:
format c: format c:
@ -87,9 +88,20 @@ while [[ -n $state ]]; do
case "$ostate" in case "$ostate" in
contexts) contexts)
if [[ $PREFIX != :*: ]]; then if _wanted contexts expl context; then
_wanted contexts expl context && if [[ $PREFIX != :*: ]]; then
compadd -P : -S : "$expl[@]" completion zftp compadd -P : -S : "$expl[@]" completion zftp
elif [[ $PREFIX = :completion:* ]]; then
mesg=''
case "$PREFIX" in
:completion:[^:]#) mesg=function ;;
:completion:[^:]#:[^:]#) mesg=completer ;;
:completion:[^:]#:[^:]#:[^:]#) mesg='command or context' ;;
:completion:[^:]#:[^:]#:[^:]#:[^:]#) mesg=argument ;;
:completion:[^:]#:[^:]#:[^:]#:[^:]#:[^:]#) mesg=tag ;;
esac
[[ -n "$mesg" ]] && _message "$mesg"
fi
fi fi
;; ;;

View file

@ -12,7 +12,7 @@ _complete_help() {
for i in "${(@k)help_funcs}"; do for i in "${(@k)help_funcs}"; do
text="${text} text="${text}
tags in context ${i}" tags in context :completion:${i}"
for j in "${(@s.:.)help_funcs[$i][2,-1]}"; do for j in "${(@s.:.)help_funcs[$i][2,-1]}"; do
text="${text}${help_tags[${i}${j}]} (${j})" text="${text}${help_tags[${i}${j}]} (${j})"
done done

View file

@ -9,6 +9,10 @@
local curcontext="$curcontext" local curcontext="$curcontext"
[[ -z "$curcontext" ]] && curcontext=":correct-word" if [[ -z "$curcontext" ]]; then
curcontext="correct-word:::"
else
curcontext="correct-word:${curcontext#*:}"
fi
_main_complete _correct _main_complete _correct

View file

@ -7,6 +7,10 @@
local curcontext="$curcontext" local curcontext="$curcontext"
[[ -z "$curcontext" ]] && curcontext=":expand-word" if [[ -z "$curcontext" ]]; then
curcontext="correct-word:::"
else
curcontext="expand-word:${curcontext#*:}"
fi
_main_complete _expand _main_complete _expand

View file

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

View file

@ -7,7 +7,7 @@ subopts=()
while getopts 'O:C:' opt; do while getopts 'O:C:' opt; do
case "$opt" in case "$opt" in
O) subopts=( "${(@P)OPTARG}" ) ;; O) subopts=( "${(@P)OPTARG}" ) ;;
C) curcontext="${curontext}:$OPTARG" ;; C) curcontext="${curcontext%:*}:$OPTARG" ;;
esac esac
done done

View file

@ -16,11 +16,12 @@ local curcontext="${curcontext}" oldcontext
[[ "${#:-$PREFIX$SUFFIX}" -le 1 ]] && return 1 [[ "${#:-$PREFIX$SUFFIX}" -le 1 ]] && return 1
[[ "$curcontext" != *:correct* ]] && curcontext="${curcontext}:approximate" [[ "$curcontext" != [^:]#:correct:* ]] &&
curcontext="${curcontext/:[^:]#:/:approximate:}"
oldcontext="$curcontext" oldcontext="$curcontext"
zstyle -s ":completion${curcontext}:" max-errors cfgacc zstyle -s ":completion:${curcontext}:" max-errors cfgacc
# Get the number of errors to accept. # Get the number of errors to accept.
@ -73,18 +74,18 @@ compstate[matcher]=-1
[[ -z "$compstate[pattern_match]" ]] && compstate[pattern_match]='*' [[ -z "$compstate[pattern_match]" ]] && compstate[pattern_match]='*'
while [[ _comp_correct -le comax ]]; do while [[ _comp_correct -le comax ]]; do
curcontext="${oldcontext}:$_comp_correct" curcontext="${oldcontext/(#b)([^:]#:[^:]#:)/${match[1][1,-2]}-${_comp_correct}:}"
_description corrections _correct_expl corrections \ _description corrections _correct_expl corrections \
"e:$_comp_correct" "o:$PREFIX$SUFFIX" "e:$_comp_correct" "o:$PREFIX$SUFFIX"
if _complete; then if _complete; then
if zstyle -t ":completion${curcontext}:" insert-unambiguous && if zstyle -t ":completion:${curcontext}:" insert-unambiguous &&
[[ "${#compstate[unambiguous]}" -ge "${#:-$PREFIX$SUFFIX}" ]]; then [[ "${#compstate[unambiguous]}" -ge "${#:-$PREFIX$SUFFIX}" ]]; then
compstate[pattern_insert]=unambiguous compstate[pattern_insert]=unambiguous
elif _requested original && elif _requested original &&
( [[ compstate[nmatches] -gt 1 ]] || ( [[ compstate[nmatches] -gt 1 ]] ||
zstyle -t ":completion${curcontext}:" original ); then zstyle -t ":completion:${curcontext}:" original ); then
local expl local expl
_description -V original expl original _description -V original expl original

View file

@ -4,16 +4,17 @@
# a normal completion function, but as one possible value for the # a normal completion function, but as one possible value for the
# completer style. # completer style.
local comp name curcontext="$curcontext" oldcontext local comp name oldcontext
typeset -T curcontext="$curcontext" ccarray
[[ "$funcstack[2]" = _main_complete ]] && curcontext="${curcontext}:complete" ccarray[2]=complete
oldcontext="$curcontext" oldcontext="$curcontext"
# If we have a user-supplied context name, use only that. # If we have a user-supplied context name, use only that.
if [[ -n "$compcontext" ]]; then if [[ -n "$compcontext" ]]; then
curcontext="${curcontext}:$compcontext" ccarray[3]="$compcontext"
comp="$_comps[$compcontext]" comp="$_comps[$compcontext]"
[[ -z "$comp" ]] || "$comp" [[ -z "$comp" ]] || "$comp"
@ -25,7 +26,7 @@ fi
comp="$_comps[-first-]" comp="$_comps[-first-]"
if [[ ! -z "$comp" ]]; then if [[ ! -z "$comp" ]]; then
curcontext="${curcontext}:-first-" ccarray[3]=-first-
"$comp" "$comp"
if [[ "$_compskip" = all ]]; then if [[ "$_compskip" = all ]]; then
_compskip='' _compskip=''
@ -46,7 +47,7 @@ else
local cname="-${compstate[context]:s/_/-/}-" local cname="-${compstate[context]:s/_/-/}-"
curcontext="${oldcontext}:$cname" ccarray[3]="$cname"
comp="$_comps[$cname]" comp="$_comps[$cname]"

View file

@ -8,9 +8,8 @@
# Supported configuration keys are the same as for `_approximate', only # Supported configuration keys are the same as for `_approximate', only
# starting with `correct'. # starting with `correct'.
local ret=1 opm="$compstate[pattern_match]" curcontext="${curcontext}" local ret=1 opm="$compstate[pattern_match]"
local curcontext="${curcontext/:[^:]#:/:correct:}"
[[ "$curcontext" != :correct* ]] && curcontext="${curcontext}:correct"
compstate[pattern_match]='-' compstate[pattern_match]='-'

View file

@ -18,19 +18,19 @@ _setup "$1"
name="$2" name="$2"
zstyle -s ":completion${curcontext}:$1" format format || zstyle -s ":completion:${curcontext}:$1" format format ||
zstyle -s ":completion${curcontext}:descriptions" format format zstyle -s ":completion:${curcontext}:descriptions" format format
zstyle -s ":completion${curcontext}:$1" hidden hidden zstyle -s ":completion:${curcontext}:$1" hidden hidden
if [[ "$hidden" = (all|yes|true|1|on) ]]; then if [[ "$hidden" = (all|yes|true|1|on) ]]; then
[[ "$hidden" = all ]] && format='' [[ "$hidden" = all ]] && format=''
hide=(-n) hide=(-n)
fi fi
zstyle -s ":completion${curcontext}:$1" group-name gname && zstyle -s ":completion:${curcontext}:$1" group-name gname &&
[[ -z "$gname" ]] && gname="$1" [[ -z "$gname" ]] && gname="$1"
zstyle -s ":completion${curcontext}:$1" matcher match && zstyle -s ":completion:${curcontext}:$1" matcher match &&
match=(-M "${(q)match}") match=(-M "${(q)match}")
if zstyle -a ":completion${curcontext}:$1" ignored-patterns _comp_ignore; then if zstyle -a ":completion:${curcontext}:$1" ignored-patterns _comp_ignore; then
ign=(-F _comp_ignore) ign=(-F _comp_ignore)
else else
_comp_ignore=() _comp_ignore=()

View file

@ -7,13 +7,12 @@
# the expansions done produce no result or do not change the original # the expansions done produce no result or do not change the original
# word from the line. # word from the line.
local exp word="$PREFIX$SUFFIX" sort expr expl curcontext="${curcontext}" local exp word="$PREFIX$SUFFIX" sort expr expl
local curcontext="${curcontext/:[^:]#:/:expand:}"
[[ "$curcontext" != :expand* ]] && curcontext="${curcontext}:expand"
# First, see if we should insert all *completions*. # First, see if we should insert all *completions*.
if zstyle -s ":completion${curcontext}:" completions expr && if zstyle -s ":completion:${curcontext}:" completions expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]]; then [[ "${(e):-\$[$expr]}" -eq 1 ]]; then
compstate[insert]=all compstate[insert]=all
return 1 return 1
@ -30,7 +29,7 @@ exp=("$word")
# First try substitution. That weird thing spanning multiple lines # First try substitution. That weird thing spanning multiple lines
# changes quoted spaces, tabs, and newlines into spaces. # changes quoted spaces, tabs, and newlines into spaces.
zstyle -s ":completion${curcontext}:" substitute expr && zstyle -s ":completion:${curcontext}:" substitute expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]] && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
exp=( "${(e)exp//\\[ exp=( "${(e)exp//\\[
]/ }" ) ]/ }" )
@ -41,7 +40,7 @@ zstyle -s ":completion${curcontext}:" substitute expr &&
# Now try globbing. # Now try globbing.
zstyle -s ":completion${curcontext}:" glob expr && zstyle -s ":completion:${curcontext}:" glob expr &&
[[ "${(e):-\$[$expr]}" -eq 1 ]] && [[ "${(e):-\$[$expr]}" -eq 1 ]] &&
exp=( ${~exp}(N) ) exp=( ${~exp}(N) )
@ -53,7 +52,7 @@ zstyle -s ":completion${curcontext}:" glob expr &&
# Now add as matches whatever the user requested. # Now add as matches whatever the user requested.
zstyle -s ":completion${curcontext}:" sort sort zstyle -s ":completion:${curcontext}:" sort sort
[[ "$sort" = (yes|true|1|on) ]] && exp=( "${(@o)exp}" ) [[ "$sort" = (yes|true|1|on) ]] && exp=( "${(@o)exp}" )

View file

@ -25,11 +25,11 @@ if [[ "$group[2]" = files ]]; then
group=() group=()
fi fi
if zstyle -s ":completion${curcontext}:all-files" file-patterns tmp && if zstyle -s ":completion:${curcontext}:all-files" file-patterns tmp &&
[[ -n "$tmp" ]]; then [[ -n "$tmp" ]]; then
aopts=(-g "$tmp") aopts=(-g "$tmp")
fi fi
if zstyle -s ":completion${curcontext}:directories" file-patterns tmp && if zstyle -s ":completion:${curcontext}:directories" file-patterns tmp &&
[[ -n "$tmp" ]]; then [[ -n "$tmp" ]]; then
dopts=(-g "$tmp") dopts=(-g "$tmp")
if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then
@ -38,7 +38,7 @@ if zstyle -s ":completion${curcontext}:directories" file-patterns tmp &&
type="${type}dir" type="${type}dir"
fi fi
fi fi
if zstyle -s ":completion${curcontext}:globbed-files" file-patterns tmp && if zstyle -s ":completion:${curcontext}:globbed-files" file-patterns tmp &&
[[ -n "$tmp" ]]; then [[ -n "$tmp" ]]; then
gopts=(-g "$tmp") gopts=(-g "$tmp")
if [[ "$type" != (*dir*glob*|*glob*dir*) ]]; then if [[ "$type" != (*dir*glob*|*glob*dir*) ]]; then
@ -64,7 +64,7 @@ while _tags; do
group[2]=all-files group[2]=all-files
_setup all-files _setup all-files
[[ -z "$hasign" ]] && [[ -z "$hasign" ]] &&
zstyle -a ":completion${curcontext}:all-files" ignored-patterns _comp_ignore && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore &&
ign=(-F _comp_ignore) ign=(-F _comp_ignore)
fi fi
_path_files "$opts[@]" "$ign[@]" "$aopts[@]" _path_files "$opts[@]" "$ign[@]" "$aopts[@]"
@ -75,7 +75,7 @@ while _tags; do
group[2]=globbed-files group[2]=globbed-files
_setup globbed-files _setup globbed-files
[[ -z "$hasign" ]] && [[ -z "$hasign" ]] &&
zstyle -a ":completion${curcontext}:all-files" ignored-patterns _comp_ignore && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore &&
ign=(-F _comp_ignore) ign=(-F _comp_ignore)
fi fi
_path_files "$opts[@]" "$ign[@]" "$dopts[@]" "$gopts[@]" && return 0 _path_files "$opts[@]" "$ign[@]" "$dopts[@]" "$gopts[@]" && return 0
@ -84,7 +84,7 @@ while _tags; do
group[2]=directories group[2]=directories
_setup directories _setup directories
[[ -z "$hasign" ]] && [[ -z "$hasign" ]] &&
zstyle -a ":completion${curcontext}:all-files" ignored-patterns _comp_ignore && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore &&
ign=(-F _comp_ignore) ign=(-F _comp_ignore)
fi fi
_path_files "$opts[@]" "$ign[@]" "$dopts[@]" && return 0 _path_files "$opts[@]" "$ign[@]" "$dopts[@]" && return 0
@ -94,7 +94,7 @@ while _tags; do
group[2]=globbed-files group[2]=globbed-files
_setup globbed-files _setup globbed-files
[[ -z "$hasign" ]] && [[ -z "$hasign" ]] &&
zstyle -a ":completion${curcontext}:all-files" ignored-patterns _comp_ignore && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore &&
ign=(-F _comp_ignore) ign=(-F _comp_ignore)
fi fi
if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then

View file

@ -4,11 +4,11 @@
# insert possible completions only after the list has been shown at # insert possible completions only after the list has been shown at
# least once. # least once.
local pre suf curcontext="${curcontext}:list" expr local pre suf expr curcontext="${curcontext/:[^:]#:/:list:}"
# Get the strings to compare. # Get the strings to compare.
if zstyle -t ":completion${curcontext}:" word; then if zstyle -t ":completion:${curcontext}:" word; then
pre="$HISTNO$LBUFFER" pre="$HISTNO$LBUFFER"
suf="$RBUFFER" suf="$RBUFFER"
else else
@ -18,7 +18,7 @@ fi
# Should we only show a list now? # Should we only show a list now?
zstyle -s ":completion${curcontext}:" condition expr zstyle -s ":completion:${curcontext}:" condition expr
if [[ ( -z "$expr" || "${(e):-\$[$expr]}" -eq 1 ) && if [[ ( -z "$expr" || "${(e):-\$[$expr]}" -eq 1 ) &&
( "$pre" != "$_list_prefix" || "$suf" != "$_list_suffix" ) ]]; then ( "$pre" != "$_list_prefix" || "$suf" != "$_list_suffix" ) ]]; then

View file

@ -35,6 +35,8 @@ _failed_tags=()
typeset -U _lastdescr typeset -U _lastdescr
[[ -z "$curcontext" ]] && curcontext=:::
# Special completion contexts after `~' and `='. # Special completion contexts after `~' and `='.
if compset -P 1 '='; then if compset -P 1 '='; then
@ -55,7 +57,7 @@ _last_menu_style=()
if (( ! $# )); then if (( ! $# )); then
local tmp local tmp
zstyle -a ":completion${curcontext}:" completer tmp zstyle -a ":completion:${curcontext}:" completer tmp
set -- "$tmp[@]" set -- "$tmp[@]"
fi fi
@ -123,7 +125,7 @@ if (( $compstate[nmatches] )); then
fi fi
elif [[ compstate[matcher] -eq compstate[total_matchers] && elif [[ compstate[matcher] -eq compstate[total_matchers] &&
$#_lastdescr -ne 0 ]] && $#_lastdescr -ne 0 ]] &&
zstyle -s ":completion${curcontext}:warnings" format format; then zstyle -s ":completion:${curcontext}:warnings" format format; then
local str local str
_lastdescr=( "\`${(@)^_lastdescr:#}'" ) _lastdescr=( "\`${(@)^_lastdescr:#}'" )

View file

@ -1,7 +1,7 @@
#autoload #autoload
# This is intended to be used as a completer function after the normal # This is intended to be used as a completer function after the normal
# completer as in: `zstyle ":completion:*" completer _complete _match'. # completer as in: `zstyle ":completion:::::" completer _complete _match'.
# It temporarily switches on pattern matching, allowing you to try # It temporarily switches on pattern matching, allowing you to try
# completion on patterns without having to setopt glob_complete. # completion on patterns without having to setopt glob_complete.
# #
@ -10,7 +10,7 @@
# be expanded using globbing. # be expanded using globbing.
local tmp opm="$compstate[pattern_match]" ret=0 orig ins local tmp opm="$compstate[pattern_match]" ret=0 orig ins
local curcontext="${curcontext}:match" local curcontext="${curcontext/:[^:]#:/:match:}"
# Do nothing if we don't have a pattern or there are still global # Do nothing if we don't have a pattern or there are still global
# match specifications to try. # match specifications to try.
@ -19,8 +19,8 @@ tmp="${${:-$PREFIX$SUFFIX}#[~=]}"
[[ "$tmp:q" = "$tmp" || [[ "$tmp:q" = "$tmp" ||
compstate[matcher] -ne compstate[total_matchers] ]] && return 1 compstate[matcher] -ne compstate[total_matchers] ]] && return 1
zstyle -s ":completion${curcontext}:" original orig zstyle -s ":completion:${curcontext}:" original orig
zstyle -b ":completion${curcontext}:" insert-unambiguous ins zstyle -b ":completion:${curcontext}:" insert-unambiguous ins
# Try completion without inserting a `*'? # Try completion without inserting a `*'?

View file

@ -1,12 +1,12 @@
#autoload #autoload
local curcontext="${curcontext}:menu" local curcontext="${curcontext/:[^:]#:/:menu:}"
# This completer is an example showing how menucompletion can be # This completer is an example showing how menucompletion can be
# implemented with the new completion system. # implemented with the new completion system.
# Use this one before the normal _complete completer, as in: # Use this one before the normal _complete completer, as in:
# #
# zstyle ":completion:*" completer _menu _complete # zstyle ":completion:::::" completer _menu _complete
if [[ -n "$compstate[old_list]" ]]; then if [[ -n "$compstate[old_list]" ]]; then

View file

@ -4,8 +4,8 @@ local format
_tags messages || return 1 _tags messages || return 1
zstyle -s ":completion${curcontext}:messages" format format || zstyle -s ":completion:${curcontext}:messages" format format ||
zstyle -s ":completion${curcontext}:descriptions" format format zstyle -s ":completion:${curcontext}:descriptions" format format
if [[ -n "$format" ]]; then if [[ -n "$format" ]]; then
zformat -f format "$format" "d:$1" "${(@)argv[2,-1]}" zformat -f format "$format" "d:$1" "${(@)argv[2,-1]}"

View file

@ -16,7 +16,7 @@ local curcontext="$curcontext"
command="$words[1]" command="$words[1]"
if [[ CURRENT -eq 1 ]]; then if [[ CURRENT -eq 1 ]]; then
curcontext="${curcontext}:-command-" curcontext="${curcontext%:*:*}:-command-:"
comp="$_comps[-command-]" comp="$_comps[-command-]"
[[ -z "$comp" ]] || "$comp" && ret=0 [[ -z "$comp" ]] || "$comp" && ret=0
@ -26,15 +26,15 @@ else
if [[ "$command[1]" == '=' ]]; then if [[ "$command[1]" == '=' ]]; then
eval cmd1\=$command eval cmd1\=$command
cmd2="$command[2,-1]" cmd2="$command[2,-1]"
curcontext="${curcontext}::${cmd2}:" curcontext="${curcontext%:*:*}:${cmd2}:"
elif [[ "$command" == */* ]]; then elif [[ "$command" == */* ]]; then
cmd1="$command" cmd1="$command"
cmd2="${command:t}" cmd2="${command:t}"
curcontext="${curcontext}::${cmd2}:" curcontext="${curcontext%:*:*}:${cmd2}:"
else else
cmd1="$command" cmd1="$command"
cmd2="$commands[$command]" cmd2="$commands[$command]"
curcontext="${curcontext}::${cmd1}:" curcontext="${curcontext%:*:*}:${cmd1}:"
fi fi
fi fi

View file

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

View file

@ -82,7 +82,7 @@ while getopts "P:S:qr:R:W:F:J:V:X:f/g:M:12n" opt; do
done done
if [[ -z "$_file_pat_checked" ]] && if [[ -z "$_file_pat_checked" ]] &&
zstyle -s ":completion${curcontext}:files" file-patterns tmp1 && zstyle -s ":completion:${curcontext}:files" file-patterns tmp1 &&
[[ -n "$tmp1" ]]; then [[ -n "$tmp1" ]]; then
if [[ "$tmp1" = '*(-/)' ]]; then if [[ "$tmp1" = '*(-/)' ]]; then
gopt='' gopt=''
@ -126,7 +126,7 @@ if [[ "$sopt" = - ]]; then
fi fi
fi fi
if zstyle -s ":completion${curcontext}:files" sort tmp1; then if zstyle -s ":completion:${curcontext}:files" sort tmp1; then
case "$tmp1" in case "$tmp1" in
*size*) sort=oL;; *size*) sort=oL;;
*links*) sort=ol;; *links*) sort=ol;;
@ -159,7 +159,7 @@ fi
# Skip over sequences of slashes. # Skip over sequences of slashes.
zstyle -t ":completion${curcontext}:paths" squeeze-slashes && skips=yes zstyle -t ":completion:${curcontext}:paths" squeeze-slashes && skips=yes
# We get the prefix and the suffix from the line and save the whole # We get the prefix and the suffix from the line and save the whole
# original string. Then we see if we will do menucompletion. # original string. Then we see if we will do menucompletion.
@ -293,7 +293,7 @@ for prepath in "$prepaths[@]"; do
[[ ! -o globdots && "$PREFIX" = .* ]] && [[ ! -o globdots && "$PREFIX" = .* ]] &&
tmp2=( "$tmp2[@]" ${^tmp1}.*(-/) ) tmp2=( "$tmp2[@]" ${^tmp1}.*(-/) )
if [[ -o globdots || "$PREFIX" = .* ]] && if [[ -o globdots || "$PREFIX" = .* ]] &&
zstyle -s ":completion${curcontext}:paths" special-dirs atmp; then zstyle -s ":completion:${curcontext}:paths" special-dirs atmp; then
if [[ "$atmp" = (yes|true|1|on) ]]; then if [[ "$atmp" = (yes|true|1|on) ]]; then
tmp2=( "$tmp2[@]" . .. ) tmp2=( "$tmp2[@]" . .. )
elif [[ "$atmp" = .. ]]; then elif [[ "$atmp" = .. ]]; then
@ -305,7 +305,7 @@ for prepath in "$prepaths[@]"; do
[[ ! -o globdots && "$PREFIX" = .* ]] && [[ ! -o globdots && "$PREFIX" = .* ]] &&
tmp2=( "$tmp2[@]" ${^tmp1}.${^~pats} ) tmp2=( "$tmp2[@]" ${^tmp1}.${^~pats} )
if (( $#tmp2 )) && if (( $#tmp2 )) &&
zstyle -s ":completion${curcontext}:files" ignore-parents rem && zstyle -s ":completion:${curcontext}:files" ignore-parents rem &&
[[ ( "$rem" != *dir* || "$pats" = '*(-/)' ) && [[ ( "$rem" != *dir* || "$pats" = '*(-/)' ) &&
( "$rem" != *..* || "$tmp1" = *../* ) ]]; then ( "$rem" != *..* || "$tmp1" = *../* ) ]]; then
if [[ "$rem" = *parent* ]]; then if [[ "$rem" = *parent* ]]; then
@ -330,7 +330,7 @@ for prepath in "$prepaths[@]"; do
expl=( "$expl[@]" -F _comp_ignore ) expl=( "$expl[@]" -F _comp_ignore )
fi fi
if [[ "$sopt" = *[/f]* && ( -o globdots || "$PREFIX" = .* ) ]] && if [[ "$sopt" = *[/f]* && ( -o globdots || "$PREFIX" = .* ) ]] &&
zstyle -s ":completion${curcontext}:paths" special-dirs atmp; then zstyle -s ":completion:${curcontext}:paths" special-dirs atmp; then
if [[ "$atmp" = (yes|true|1|on) ]]; then if [[ "$atmp" = (yes|true|1|on) ]]; then
tmp2=( "$tmp2[@]" . .. ) tmp2=( "$tmp2[@]" . .. )
elif [[ "$atmp" = .. ]]; then elif [[ "$atmp" = .. ]]; then
@ -465,8 +465,8 @@ for prepath in "$prepaths[@]"; do
compquote tmp1 tmp2 compquote tmp1 tmp2
if [[ -n $menu ]] || if [[ -n $menu ]] ||
! zstyle -t ":completion${curcontext}:paths" expand suffix; then ! zstyle -t ":completion:${curcontext}:paths" expand suffix; then
(( $#tmp4 )) && zstyle -t ":completion${curcontext}:paths" cursor && (( $#tmp4 )) && zstyle -t ":completion:${curcontext}:paths" cursor &&
compstate[to_end]='' compstate[to_end]=''
if [[ "$tmp3" = */* ]]; then if [[ "$tmp3" = */* ]]; then
compadd -Qf "$mopts[@]" -p "$linepath$tmp2" -s "/${tmp3#*/}" \ compadd -Qf "$mopts[@]" -p "$linepath$tmp2" -s "/${tmp3#*/}" \
@ -555,7 +555,7 @@ done
exppaths=( "${(@)exppaths:#$eorig}" ) exppaths=( "${(@)exppaths:#$eorig}" )
if zstyle -t ":completion${curcontext}:paths" expand prefix && if zstyle -t ":completion:${curcontext}:paths" expand prefix &&
[[ $#exppaths -gt 0 && nm -eq compstate[nmatches] ]]; then [[ $#exppaths -gt 0 && nm -eq compstate[nmatches] ]]; then
PREFIX="${opre}" PREFIX="${opre}"
SUFFIX="${osuf}" SUFFIX="${osuf}"

View file

@ -2,7 +2,7 @@
local val nm="$compstate[nmatches]" local val nm="$compstate[nmatches]"
if zstyle -a ":completion${curcontext}:$1" list-colors val; then if zstyle -a ":completion:${curcontext}:$1" list-colors val; then
zmodload -e zsh/complist || zmodload -i zsh/complist zmodload -e zsh/complist || zmodload -i zsh/complist
if [[ "$1" = default ]]; then if [[ "$1" = default ]]; then
ZLS_COLORS="${(j.:.)${(@)val:gs/:/\\\:}}" ZLS_COLORS="${(j.:.)${(@)val:gs/:/\\\:}}"
@ -11,7 +11,7 @@ if zstyle -a ":completion${curcontext}:$1" list-colors val; then
fi fi
fi fi
if zstyle -s ":completion${curcontext}:$1" list-packed val; then if zstyle -s ":completion:${curcontext}:$1" list-packed val; then
if [[ "$val" = (yes|true|1|on) ]]; then if [[ "$val" = (yes|true|1|on) ]]; then
compstate[list]="${compstate[list]} packed" compstate[list]="${compstate[list]} packed"
else else
@ -21,7 +21,7 @@ else
compstate[list]="$_saved_list" compstate[list]="$_saved_list"
fi fi
if zstyle -s ":completion${curcontext}:$1" list-rows-first val; then if zstyle -s ":completion:${curcontext}:$1" list-rows-first val; then
if [[ "$val" = (yes|true|1|on) ]]; then if [[ "$val" = (yes|true|1|on) ]]; then
compstate[list]="${compstate[list]} rows" compstate[list]="${compstate[list]} rows"
else else
@ -31,7 +31,7 @@ else
compstate[list]="$_saved_list" compstate[list]="$_saved_list"
fi fi
if zstyle -s ":completion${curcontext}:$1" last-prompt val; then if zstyle -s ":completion:${curcontext}:$1" last-prompt val; then
if [[ "$val" = (yes|true|1|on) ]]; then if [[ "$val" = (yes|true|1|on) ]]; then
compstate[last_prompt]=yes compstate[last_prompt]=yes
else else
@ -41,7 +41,7 @@ else
compstate[last_prompt]="$_saved_lastprompt" compstate[last_prompt]="$_saved_lastprompt"
fi fi
if zstyle -s ":completion${curcontext}:$1" accept-exact val; then if zstyle -s ":completion:${curcontext}:$1" accept-exact val; then
if [[ "$val" = (yes|true|1|on) ]]; then if [[ "$val" = (yes|true|1|on) ]]; then
compstate[exact]=accept compstate[exact]=accept
else else
@ -54,7 +54,7 @@ fi
[[ _last_nmatches -ge 0 && _last_nmatches -ne nm ]] && [[ _last_nmatches -ge 0 && _last_nmatches -ne nm ]] &&
_menu_style=( "$_last_menu_style[@]" "$_menu_style[@]" ) _menu_style=( "$_last_menu_style[@]" "$_menu_style[@]" )
if zstyle -a ":completion${curcontext}:$1" menu val; then if zstyle -a ":completion:${curcontext}:$1" menu val; then
_last_nmatches="$nm" _last_nmatches="$nm"
_last_menu_style=( "$val[@]" ) _last_menu_style=( "$val[@]" )
else else

View file

@ -6,15 +6,15 @@ comptry options
case "$curcontext" in case "$curcontext" in
# Some silly examples commented out: # Some silly examples commented out:
# #
# *::*p[bgpn]m:*) # change the order for file-completion # *:*:*:*p[bgpn]m:*) # change the order for file-completion
# comptry globbed-files directories # comptry globbed-files directories
# comptry all-files # comptry all-files
# ;; # ;;
# *::dvips::-o*) # automatic context set by _arguments # *:*:*:dvips:-o*) # automatic context set by _arguments
# comptry all-files # comptry all-files
# return # return
# ;; # ;;
# *::kill:*) # *:*:*:kill:*)
# comptry processes # comptry processes
# return # this return ensures that we use only processes # return # this return ensures that we use only processes
# ;; # ;;

View file

@ -7,10 +7,10 @@ if (( $# )); then
local curcontext="$curcontext" order tag nodef local curcontext="$curcontext" order tag nodef
if [[ "$1" = -C?* ]]; then if [[ "$1" = -C?* ]]; then
curcontext="${curcontext}:${1[3,-1]}" curcontext="${curcontext%:*}:${1[3,-1]}"
shift shift
elif [[ "$1" = -C ]]; then elif [[ "$1" = -C ]]; then
curcontext="${curcontext}:${2}" curcontext="${curcontext%:*}:${2}"
shift 2 shift 2
else else
targs=() targs=()
@ -18,7 +18,7 @@ if (( $# )); then
[[ "$1" = -(|-) ]] && shift [[ "$1" = -(|-) ]] && shift
if zstyle -a ":completion${curcontext}" group-order order; then if zstyle -a ":completion:${curcontext}:" group-order order; then
local name local name
for name in "$order[@]"; do for name in "$order[@]"; do
@ -42,7 +42,7 @@ if (( $# )); then
if [[ -n "$_sort_tags" ]]; then if [[ -n "$_sort_tags" ]]; then
"$_sort_tags" "$@" "$_sort_tags" "$@"
elif zstyle -a ":completion${curcontext}" tag-order order; then elif zstyle -a ":completion:${curcontext}:" tag-order order; then
for tag in $order; do for tag in $order; do
case $tag in case $tag in

View file

@ -475,11 +475,11 @@ compstyle() {
zstyle ':completion:*' verbose 'yes' zstyle ':completion:*' verbose 'yes'
zstyle ':completion:*' prefix-needed 'yes' zstyle ':completion:*' prefix-needed 'yes'
zstyle ':completion:*' prefix-hidden 'no' zstyle ':completion:*' prefix-hidden 'no'
zstyle ':completion:(correct|approximate):' max-errors '2' numeric zstyle ':completion:*:(correct|approximate):*' max-errors '2' numeric
zstyle ':completion:correct:' prompt 'correct to:' zstyle ':completion:*:correct:*' prompt 'correct to:'
zstyle ':completion:*' completer '_complete' zstyle ':completion:*::::' completer '_complete'
zstyle ':completion*:default' list-colors "${(s.:.)ZLS_COLORS:-${ZLS_COLOURS:-no=0:fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:ex=0}}" zstyle ':completion:*::::default' list-colors "${(s.:.)ZLS_COLORS:-${ZLS_COLOURS:-no=0:fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:ex=0}}"
(( $+SELECTMIN )) && zstyle ':completion*:default' menu "select=$SELECTMIN" (( $+SELECTMIN )) && zstyle ':completion:*::::default' menu "select=$SELECTMIN"
zstyle ':completion:*' tag-order 'arguments values' options \ zstyle ':completion:*' tag-order 'arguments values' options \
globbed-files directories all-files globbed-files directories all-files

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}) 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=' _describe -o option tmp2 -- tmp3 -S='
comp_opt='{ ! zstyle -t ":completion${curcontext}: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_short=()
regex_long=() regex_long=()

View file

@ -39,7 +39,7 @@ _deb_packages () {
return return
} }
zstyle -s ":completion${curcontext}" packageset pkgset zstyle -s ":completion:${curcontext}:" packageset pkgset
[[ "$pkgset" = (installed|uninstalled|avail|available) ]] || { [[ "$pkgset" = (installed|uninstalled|avail|available) ]] || {
pkgset="$command" pkgset="$command"

View file

@ -40,7 +40,7 @@ _cvs_command () {
cmd="${${(k)cmds[(R)* $words[1] *]}:-${(k)cmds[(i)$words[1]]}}" cmd="${${(k)cmds[(R)* $words[1] *]}:-${(k)cmds[(i)$words[1]]}}"
if (( $#cmd )); then if (( $#cmd )); then
curcontext="${curcontext%:*}:$cmd" curcontext="${curcontext%:*:*}:cvs-${cmd}:"
_cvs_$cmd _cvs_$cmd
else else
_message "unknown cvs command: $words[1]" _message "unknown cvs command: $words[1]"
@ -390,7 +390,7 @@ _cvs_watchers () {
(( $+functions[_cvs_loadstat] )) || (( $+functions[_cvs_loadstat] )) ||
_cvs_loadstat () { _cvs_loadstat () {
zstyle -t ":completion${curcontext}:cvs" disable-stat && return zstyle -t ":completion:${curcontext}:" disable-stat && return
(( $+_cvs_loadstat_tried )) && return (( $+_cvs_loadstat_tried )) && return
_cvs_loadstat_tried=yes _cvs_loadstat_tried=yes

View file

@ -2,7 +2,7 @@
local expl domains tmp local expl domains tmp
if ! zstyle -a ":completion${curcontext}:domains" domains domains; then if ! zstyle -a ":completion:${curcontext}:domains" domains domains; then
if (( ! $+_cache_domains )); then if (( ! $+_cache_domains )); then
_cache_domains=() _cache_domains=()
if [[ -f /etc/resolv.conf ]]; then if [[ -f /etc/resolv.conf ]]; then

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -286,29 +286,62 @@ was tried. The context depends on such things as the name of the
command when completing an argument, and possibily also command when completing an argument, and possibily also
the name of an option when completing an argument to that option. the name of an option when completing an argument to that option.
The completion system represents contexts as hierarchical name s The context names always consists of the following fields, separated
with components separated by colons. For example, take the context by colons:
`tt(:completion:complete::dvips::-o-1)'. The tt(:completion) at the
beginning just says that this context is used in the completion system startitem()
and the tt(:complete) after it is the `completer', which is in overall item()(
control of how completion is to be performed; `tt(complete)' is the The literal string tt(completion), saying that this style is used by
basic one for ordinary completion, but completers may perform various the completion system.
related tasks such as correction, or modify the behaviour of a later )
completer (see item()(
The var(function); in many cases this field will be blank, but when
the completion system is called from other functions, like
tt(predict-on) or one of the functions in the tt(Command) directory of
the distribution, this field contains the (probably abbreviated) name
of that function.
)
item()(
The var(completer) currently active, i.e. the name of the completer
function without the leading underscore. Such a completer is in
overall control of how completion is to be performed; `tt(complete)'
is the basic one for ordinary completion, but completers may perform
various related tasks such as correction, or modify the behaviour of a
later completer (see
ifzman(the section `Control Functions' below)\ ifzman(the section `Control Functions' below)\
ifnzman(noderef(Control Functions)) ifnzman(noderef(Control Functions))
for more information). Strictly, the completer is `tt(_complete)', but the for more information).
underscore is omitted from the context; this is also true of `tt(correct)', )
`tt(approximate)', etc. The tt(::dvips:) shows that we are item()(
completing arguments for the tt(dvips) command. The doubled colon The var(context) or var(command). This is either one of the special
will appear only before and after the name of the command, but note context names such as tt(-condition-) as explained for the
that the second colon after the command name is only added when tt(_complete) completer below, or the name of the command we are
there is at least one more component (otherwise the whole name ends in completing arguments for. Commands that have sub-commands usually
a colon, e.g. `tt(...dvips:)'). Finally, the string tt(-o-1) says that we modify this field to contain the name of the command followed by a
are completing the first argument of the option `tt(-o)' to the command. minus sign and the sub-command (e.g. the completion function for the
Note that the existence of a context like this does not necessarily mean it tt(cvs) command sets this field to striings such as tt(cvs-add) when
is handled specially by the completion system; this is determined by trying completing for the tt(add) sub-command).
to match the context as specifically as possible, as described below. )
item()(
The var(argument), describing which argument we are
completing. Normally this is either a string of the form
tt(argument-)var(n), where var(n) is the number of the argument or it
is a string of the form tt(-)var(opt)tt(-)var(n) when completing the
var(n)'th argument of the option var(opt).
)
item()(
The var(tag). Tags are used for two purposes: completion functions use
them to describe the types of matches they can generate for a certain
context and they use them to simplify the definition of styles that
are tested.
)
enditem()
As an example, leaving out the var(tag) for the moment, the context name
`tt(:completion::complete:dvips:-o-1:files)' says that normal
completion was attempted on an argument of the tt(dvips)
command. More precisely: completion was attempted on the first
argument after the tt(-o) option.
In many of the possible contexts the completion system can generate In many of the possible contexts the completion system can generate
matches, often multiple types of matches. These types are represented as matches, often multiple types of matches. These types are represented as
@ -335,9 +368,8 @@ Completion behaviour can be modified by various other
(see (see
ifzman(zmanref(zshmodules))\ ifzman(zmanref(zshmodules))\
ifnzman(noderef(The zsh/zutil Module))). ifnzman(noderef(The zsh/zutil Module))).
The full context used in looking up styles is the prefix `tt(:completion)' When looking up styles the completion system uses full context names,
followed by the context as described above, followed by another colon and including the tag.
the name of the tag currently being tried for completion.
Styles determine such things as how the matches are generated; some of them Styles determine such things as how the matches are generated; some of them
correspond to shell options (for example, the use of menu completion), but correspond to shell options (for example, the use of menu completion), but
@ -366,14 +398,14 @@ listed with the full job texts and the command lines of the processes (the
latter is achieved by calling the tt(ps) command). To make this builtin latter is achieved by calling the tt(ps) command). To make this builtin
list the matches only as numbers one could call: list the matches only as numbers one could call:
example(zstyle ':completion:*::kill:*' verbose no) example(zstyle ':completion:*:*:kill:*' verbose no)
Furhtermore, if one wanted to see the command lines for processes but not the Furthermore, if one wanted 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 job texts one could use the fact that the tag name is appended to the
context name when styles are looked up. As the function for the tt(kill) context name when styles are looked up. As the function for the tt(kill)
builtin command uses the tags tt(jobs) and tt(processes), we have: builtin command uses the tags tt(jobs) and tt(processes), we have:
example(zstyle ':completion:*::kill:*:jobs' verbose no) example(zstyle ':completion:*:*:kill:*:jobs' verbose no)
Note that the order in which styles are em(defined) does not matter; the Note that the order in which styles are em(defined) does not matter; the
style mechanism uses the most specific possible match for a particular style mechanism uses the most specific possible match for a particular
@ -440,9 +472,6 @@ corrections
item(tt(cursors))( item(tt(cursors))(
for cursor names used by X programs for cursor names used by X programs
) )
item(tt(cvs))(
used only to look up the value of the tt(disable-stat) style
)
item(tt(default))( item(tt(default))(
used to look up default values for various styles that may also be set used to look up default values for various styles that may also be set
for tags that are used when generating matches for tags that are used when generating matches
@ -681,9 +710,9 @@ example, to use completion, approximation and correction for normal
completion, completion and correction for incremental completion and completion, completion and correction for incremental completion and
only completion for prediction one could use: only completion for prediction one could use:
example(zstyle ':completion:*' completer _complete _correct _approximate example(zstyle ':completion:::::' completer _complete _correct _approximate
zstyle ':completion:incremental' completer _complete _correct zstyle ':completion:incremental::::' completer _complete _correct
zstyle ':completion:predict' completer _complete) zstyle ':completion:predict::::' completer _complete)
) )
item(tt(completions))( item(tt(completions))(
This style is used by the tt(_expand) completer function. This style is used by the tt(_expand) completer function.
@ -704,7 +733,7 @@ should be an expression usable inside a `tt($((...)))'
arithmetical expression. In this case, delaying will be done if the arithmetical expression. In this case, delaying will be done if the
expression evaluates to `tt(1)'. For example, with expression evaluates to `tt(1)'. For example, with
example(zstyle ':completion:list' condition 'NUMERIC != 1') example(zstyle ':completion:*:list:::' condition 'NUMERIC != 1')
delaying will be done only if given an explicit numeric argument delaying will be done only if given an explicit numeric argument
other than `tt(1)'. other than `tt(1)'.
@ -716,7 +745,7 @@ after the first ambiguous pathname component even when menucompletion
is used. is used.
) )
item(tt(disable-stat))( item(tt(disable-stat))(
This is used with the tt(cvs) tag by the function completing for the This is used with the an empty tag by the function completing for the
tt(cvs) command to decide if the tt(zsh/stat) module should be used to tt(cvs) command to decide if the tt(zsh/stat) module should be used to
generate only names of modified files in the appropriate places. generate only names of modified files in the appropriate places.
) )
@ -761,7 +790,7 @@ specified another order to be used with the tt(tag-order) style).
For example, to make the completion system first try only filenames For example, to make the completion system first try only filenames
matching the pattern tt(*.o) for the tt(rm) command, one would use: matching the pattern tt(*.o) for the tt(rm) command, one would use:
example(zstyle ':completion:*::rm*:globbed-files' file-patterns '*.o') example(zstyle ':completion:*:*:rm:*:globbed-files' file-patterns '*.o')
With this, using only filenames ending in tt(.o) will be the first With this, using only filenames ending in tt(.o) will be the first
choice and other filenames will only be used if what is on the line choice and other filenames will only be used if what is on the line
@ -821,8 +850,8 @@ aliases and shell functions and reserved words as possible
completions. To have the external commands and shell functions listed completions. To have the external commands and shell functions listed
separately, one can set: separately, one can set:
example(zstyle ':completion:*:-command-:commands' group-name commands example(zstyle ':completion:*:*:-command-:*:commands' group-name commands
zstyle ':completion:*:-command-:functions' group-name functions) zstyle ':completion:*:*:-command-:*:functions' group-name functions)
This also means that if the same name is used for different types of 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 matches, then those matches will be displayed together in the same
@ -851,7 +880,7 @@ For example, to have names of builtin commands, shell functions and
external commands appear in this order when completing in command external commands appear in this order when completing in command
position one would set: position one would set:
example(zstyle ':completion:*:-command-' group-order builtins functions commands) example(zstyle ':completion:*:*:-command-' group-order builtins functions commands)
) )
item(tt(groups))( item(tt(groups))(
A style holding the names of the groups that should be completed. If A style holding the names of the groups that should be completed. If
@ -924,7 +953,11 @@ item(tt(insert-unambiguous))(
This is used by the tt(_match) and tt(_approximate) completer This is used by the tt(_match) and tt(_approximate) completer
functions. If it is set to `true', the completer will start menu functions. If it is set to `true', the completer will start menu
completion only if no unambiguous string could be generated that is at completion only if no unambiguous string could be generated that is at
least as long as the original string from the line. least as long as the original string from the line. Note that the
tt(_approximate) completer uses it after setting the completer field
in the context name to one of tt(correct-)var(num) or
tt(approximate-)var(num), where var(num) is the number of errors that
were accepted.
) )
item(tt(last-prompt))( item(tt(last-prompt))(
This is used to determine if the completion code should try to put the This is used to determine if the completion code should try to put the
@ -1046,7 +1079,7 @@ If the value for this style contains the string tt(numeric), the
completer function will take any numeric argument as the completer function will take any numeric argument as the
maximum number of errors allowed. For example, with maximum number of errors allowed. For example, with
example(zstyle ':completion:approximate' accept 2 numeric) example(zstyle ':completion:*:approximate:::' max-errors 2 numeric)
two errors will be allowed if no numeric argument is given. However, 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 with a numeric argument of six (as in `tt(ESC-6 TAB)'), up to six
@ -1116,7 +1149,10 @@ This is used by the tt(_approximate), tt(_correct) and tt(_match)
completers. The first two use it to decide if the original string should completers. The first two use it to decide if the original string should
be added as one possible completion. Normally, this is done only if there be added as one possible completion. Normally, this is done only if there
at least two possible corrections, but if this style is set to `true', it at least two possible corrections, but if this style is set to `true', it
will always be added. will always be added. Note that these completers use this style after
setting the completer field in the context name to
tt(correct-)var(num) or tt(approximate-)var(num), where var(num) is
the number of errors that were accepted.
For the tt(_match) completer, if this style is set to For the tt(_match) completer, if this style is set to
tt(only), it will try to generate matches without inserting a tt(only), it will try to generate matches without inserting a
@ -1129,7 +1165,7 @@ item(tt(packageset))(
A style containing an override for the default package set A style containing an override for the default package set
for that context. For example, for that context. For example,
example(zstyle :completion:complete::dpkg::--status-1 packageset avail) example(zstyle :completion:*:complete:dpkg:--status-1: packageset avail)
will cause available packages, rather than only installed packages, will cause available packages, rather than only installed packages,
to be completed for `dpkg --status'. to be completed for `dpkg --status'.
@ -1240,7 +1276,7 @@ non-empty string it should be an expression usable inside a `tt($((...)))'
arithmetical expression. In this case, expansion of substitutions will arithmetical expression. In this case, expansion of substitutions will
be done if the expression evaluates to `tt(1)'. For example, with be done if the expression evaluates to `tt(1)'. For example, with
example(zstyle ':completion:expand' substitute '${NUMERIC:-1} != 1') example(zstyle ':completion:*:expand:::' substitute '${NUMERIC:-1} != 1')
substitution will be performed only if given an explicit numeric substitution will be performed only if given an explicit numeric
argument other than `tt(1)', as by typing `tt(ESC 2 TAB)'. argument other than `tt(1)', as by typing `tt(ESC 2 TAB)'.
@ -1256,7 +1292,7 @@ found, the next value is used.
For example, For example,
example( example(
zstyle :completion:complete::gunzip: tag-order \ zstyle ':completion:*:complete:gunzip:*' tag-order \
'globbed-files directories' all-files 'globbed-files directories' all-files
) )
@ -1330,7 +1366,7 @@ arguments are given, the set of functions to try is taken from the
tt(completer) style. For example, to use normal completion and tt(completer) style. For example, to use normal completion and
correction if that doesn't generate any matches: correction if that doesn't generate any matches:
example(zstyle ':completion:*' completer _complete _correct) example(zstyle ':completion:::::' completer _complete _correct)
after calling tt(compinit). The default value for this style set up after calling tt(compinit). The default value for this style set up
in tt(compinit) is `tt(_complete)', i.e. normally only ordinary in tt(compinit) is `tt(_complete)', i.e. normally only ordinary
@ -1442,7 +1478,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 presented to the user. The intended use of this completer function is to
try after the normal tt(_complete) completer by setting: try after the normal tt(_complete) completer by setting:
example(zstyle ':completion:*' completer _complete _approximate) example(zstyle ':completion:::::' completer _complete _approximate)
This will give correcting completion if and only if This will give correcting completion if and only if
normal completion doesn't yield any possible completions. When normal completion doesn't yield any possible completions. When
@ -1471,9 +1507,9 @@ different top-level context name.
For example, with: For example, with:
example(zstyle ':completion:*' completer _complete _correct _approximate example(zstyle ':completion:::::' completer _complete _correct _approximate
zstyle ':completion:correct' accept 2 not-numeric zstyle ':completion:*:correct:::' accept 2 not-numeric
zstyle ':completion:approximate' accept 3 numeric) zstyle ':completion:*:approximate:::' accept 3 numeric)
correction will accept up to two errors. If a numeric argument is correction will accept up to two errors. If a numeric argument is
given, correction will not be performed, but correcting completion given, correction will not be performed, but correcting completion
@ -1783,7 +1819,7 @@ non-zero otherwise.
This function also accepts the tt(-C) option followed by a This function also accepts the tt(-C) option followed by a
var(name). This name is temporarily (i.e. not visible outside var(name). This name is temporarily (i.e. not visible outside
tt(_tags)) appended (with a colon before it) to the contents of the tt(_tags)) stored in the argument field of the context name in the
tt(curcontext) parameter. This allows to make tt(_tags) use a more tt(curcontext) parameter. This allows to make tt(_tags) use a more
specific context name without having to change and reset the specific context name without having to change and reset the
tt(curcontext) parameter (which would otherwise have the same effect). tt(curcontext) parameter (which would otherwise have the same effect).
@ -1868,8 +1904,8 @@ example(_alternative \
to offer usernames and hostnames as possible matches (which are to offer usernames and hostnames as possible matches (which are
generated by the tt(_users) and tt(_hosts) functions respectively). generated by the tt(_users) and tt(_hosts) functions respectively).
Like tt(_tags) this function supports the tt(-C) option to give an Like tt(_tags) this function supports the tt(-C) option to give a
additional context name component. different name for the argument context field.
) )
findex(_describe) findex(_describe)
item(tt(_describe) var(descr) var(name1) [ var(name2) ] var(opts) ... tt(-)tt(-) ...)( item(tt(_describe) var(descr) var(name1) [ var(name2) ] var(opts) ... tt(-)tt(-) ...)(

View file

@ -3,26 +3,27 @@ Contexts, tags and all that
The completion system keeps track of the current context in the The completion system keeps track of the current context in the
parameter `curcontext'. It's content is the hierarchical name for the parameter `curcontext'. It's content is the hierarchical name for the
current context sans the tag currently tried. The tags represent current context sans the `:completion:' and the last colon and the tag
different types of matches. So, whenever you are about to add matches, currently tried. The tags represent different types of matches. So,
you should use a tag for them and test if the user wants this type of whenever you are about to add matches, you should use a tag for them
matches to be generated. However, this only really needs to be done if and test if the user wants this type of matches to be generated.
no other function in the call chain has tested that already or if you However, this only really needs to be done if no other function in the
can offer different types of matches. call chain has tested that already or if you can offer different types
of matches.
Most of the utility functions do the testing themselves, so you don't Most of the utility functions do the testing themselves, so you don't
have to worry about that at all. For example if you are adding matches have to worry about that at all. For example if you are adding matches
with `_files', `_hosts' or functions like these, you can just call with `_files', `_hosts' or functions like these, you can just call
them and they do the tests needed. The functions `_arguments' and them and they do the tests needed. The functions `_arguments' and
`_values' do that too, but there is a small difference. These `_values' do that too, but there is a small difference. These
functions effectively add a new component to the hierarchical context functions effectively change the context name and if you are using the
name and if you are using the `->state' form for actions, this new `->state' form for actions, this changed name component has to be
component has to be reported back to the function calling `_arguments' reported back to the function calling `_arguments' or `_values'. This
or `_values'. This is done with the parameter `context', so you have is done with the parameter `context', so you have to make that local
to make that local in the calling function in the same way as you have in the calling function in the same way as you have to make local
to make local `line', `state', and `{opt,val}_args'. This parameter `line', `state', and `{opt,val}_args'. This parameter `context' should
`context' should then be used when you start adding matches by giving then be used when you start adding matches by giving it to functions
it to functions like `_tags' via the `-C' options, as in: like `_tags' via the `-C' options, as in:
local context ... local context ...
... ...
@ -33,8 +34,8 @@ it to functions like `_tags' via the `-C' options, as in:
... ...
fi fi
This will append the context name given to the `curcontext' parameter This will put the context name given in the argument field of the
(preceding it with a colon) and this context will then be used to look `curcontext' parameter and this context will then be used to look
up styles for the tags. up styles for the tags.
But since this is often used, `_arguments' and `_values' have support But since this is often used, `_arguments' and `_values' have support
@ -46,7 +47,7 @@ reported back to functions you call. E.g.:
local curcontext="$curcontext" ... local curcontext="$curcontext" ...
... ...
_arguments ... 'foo:foo:->foo' _arguments -C ... 'foo:foo:->foo'
... ...
if [[ "$state" = foo ]]; then if [[ "$state" = foo ]]; then
_tags ... _tags ...
@ -74,8 +75,8 @@ types is requested by the user, so you can just do:
Since this sequence of command is used so often, the `_wanted' Since this sequence of command is used so often, the `_wanted'
function was added which just calls `_tags' with its first argument function was added which just calls `_tags' with its first argument
(i.e. the first argument os a tag) and then calls `_description' with (i.e. the first argument is a tag) and then calls `_description' with
all other arguments. The return value is as for `_tags' -- zero if the all its arguments. The return value is as for `_tags' -- zero if the
matches should be added. So the example becomes: matches should be added. So the example becomes:
_wanted names expl 'name' && compadd "$expl[@]" alice bob _wanted names expl 'name' && compadd "$expl[@]" alice bob
@ -106,16 +107,16 @@ for this uses `_tags' and `_requested':
(( ret )) || break # leave the loop if matches were added (( ret )) || break # leave the loop if matches were added
done done
`_tags' with tags as arguments registers those tags and calls `_tags' with tags as arguments registers those tags and checks which
`_sort_tags' so that the user can say which in which order the tags of them the user wants to see and in which order the tags are to be
are to be tried. This means that internally these tags are stored in tried. This means that internally these tags are stored in multiple
multiple sets. The types of matches represented by the tags from the sets. The types of matches represented by the tags from the first set
first set should be tried first. If that generates no matches, the should be tried first. If that generates no matches, the second set is
second set is tried and so on. `_tags' without arguments just makes tried and so on. `_tags' without arguments just makes the next set be
the next set be tried (on the first call it makes the first set be tried (on the first call it makes the first set be used). The function
used). The function `_requested' then tests if the tag given as its `_requested' then tests if the tag given as its first argument is in
first argument is in the set currently used and returns zero if it is, the set currently used and returns zero if it is, i.e. if matches of
i.e. if matches of that type should be added now. that type should be added now.
But `_requested' can do more: since it is very common that you add But `_requested' can do more: since it is very common that you add
different types of matches in different groups, with each group having different types of matches in different groups, with each group having
@ -130,7 +131,7 @@ change the example above to:
_tags friends users hosts _tags friends users hosts
while _tags; do while _tags; do
_requested friends expl friend && compad "$expl[@]" alice bob && ret=0 _requested friends expl friend && compadd "$expl[@]" alice bob && ret=0
_requested users && _users && ret=0 _requested users && _users && ret=0
_requested hosts && _hosts && ret=0 _requested hosts && _hosts && ret=0
@ -138,7 +139,7 @@ change the example above to:
done done
This looks better already. But in many cases such as this one you can This looks better already. But in many cases such as this one you can
also use the function `_laternative' which simply implements a loop also use the function `_alternative' which simply implements a loop
like this one. It gets arguments of the form `tag:descr:action'. E.g.: like this one. It gets arguments of the form `tag:descr:action'. E.g.:
_alternative \ _alternative \
@ -148,7 +149,7 @@ like this one. It gets arguments of the form `tag:descr:action'. E.g.:
Which does the same as the previous examples. (Note the empty Which does the same as the previous examples. (Note the empty
descriptions in the last two arguments -- the actions start with a descriptions in the last two arguments -- the actions start with a
space so that they are executed without giving the the description space so that they are executed without giving the description
build by `_alternative', i.e. we just use the description added by build by `_alternative', i.e. we just use the description added by
`_users' and `_hosts'). `_users' and `_hosts').
@ -162,11 +163,11 @@ For the names of the tags: choose simple (short, if at all possible)
names in plural. Also, first have a look at the tag names already used names in plural. Also, first have a look at the tag names already used
by other functions and if any of these names seem sensible for the by other functions and if any of these names seem sensible for the
type of matches you are about to add, the use those names. This will type of matches you are about to add, the use those names. This will
allow users to define styles for certain types of matches indepent of allow users to define styles for certain types of matches independent
the place where they are added. of the place where they are added.
One final comment about when to use your own sub-contexts: do this One final comment about when to use your own argument-contexts: do
when the command you are writing a completion function for has this when the command you are writing a completion function for has
different `modes'. E.g. if it accepts host names after a `-h' option different `modes'. E.g. if it accepts host names after a `-h' option
and users or hosts after `-u' and for some reason you can't use and users or hosts after `-u' and for some reason you can't use
`_arguments' to do the work for you, then use context names as in: `_arguments' to do the work for you, then use context names as in:
@ -185,30 +186,31 @@ Styles
------ ------
Users can associate patterns for hierarchical context names with Users can associate patterns for hierarchical context names with
certain styles using the `compstyle' function. The completion code certain styles using the `zstyle' builtin. The completion code
should then use these styles to decide how matches should be added and should then use these styles to decide how matches should be added and
to get user-configured values. This is done using the builtin `zstyle'. to get user-configured values. This, too, is done using the builtin
`zstyle'.
Basically styles map names to a bunch of strings (the `value'). In 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 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 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: the tag `options' in the context you are currently in, you can just do:
if zstyle -t ":completion${curcontext}:options" verbose; then if zstyle -t ":completion:${curcontext}:options" verbose; then
# yes, it is set... # yes, it is set...
fi fi
I.e. with the -t option and two arguments `zstyle' takes the first one 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 as a context 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 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 is set to one of `yes', `true', `on', or `1' and interprets that as
`true' and every other value as `false'. `true' and every other value as `false'.
For more complicated style for which you want to test if the value For more complicated styles for which you want to test if the value
matches a certain pattern, you can use `zstyle' with the -m option and matches a certain pattern, you can use `zstyle' with the -m option and
three arguments: three arguments:
if zstyle -m ":completion${curcontext}:foo" bar '*baz*'; then if zstyle -m ":completion:${curcontext}:foo" bar '*baz*'; then
... ...
fi fi
@ -219,15 +221,15 @@ 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 equal to any of a number of a strings, you can use the -t option and
give the strings after the style name: give the strings after the style name:
if zstyle -t ":completion${curcontext}:foo" bar str1 str2; then if zstyle -t ":completion:${curcontext}:foo" bar str1 str2; then
... ...
fi fi
But sometimes you want to actually get the value stored for a certain But sometimes you want to actually get the value stored for a certain
style instead of just testing it. For this `zstyle' supports four style instead of just testing it. For this `zstyle' supports four
options: `-b', `-s', `-a', and `-h'. After these options, three options: `-b', `-s', `-a', and `-h'. After these options, three
arguments are expected, the tag, the style, and a parameter name. The arguments are expected, the context, the style, and a parameter name.
parameter will then be set to the value of the style and the option 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 says how the strings stored as a value will be stored in the
parameter: parameter:
@ -287,8 +289,7 @@ want to use. For example:
_description tag expl '...' _description tag expl '...'
compadd "$expl[@]" -1V foo - ... # THIS IS WRONG!!! compadd "$expl[@]" -1V foo - ... # THIS IS WRONG!!!
is *not* the right way to use a unsorted group. Instead do the is *not* the right way to use a unsorted group. Instead do:
simpler:
_description -1V tag expl '...' _description -1V tag expl '...'
compadd "$expl[@]" - ... compadd "$expl[@]" - ...
@ -301,7 +302,7 @@ multiple calls to `_description' and add them with multiple calls to
different tags anyway, so, see above. different tags anyway, so, see above.
And since a tag directly corresponds to a group of matches, you'll And since a tag directly corresponds to a group of matches, you'll
often be using the tags function that allow you to give the often be using the tags function that allows you to give the
explanation to the same function that is used to test if the tags are explanation to the same function that is used to test if the tags are
requested (again: see above). Just as a reminder: requested (again: see above). Just as a reminder:
@ -337,8 +338,8 @@ Misc. remarks
This guarantees that your functions will be re-usable because calling This guarantees that your functions will be re-usable because calling
functions may rely on the correct return value. functions may rely on the correct return value.
5) When writing helper functions that generate matches, the arguments 5) When writing helper functions that generate matches, the arguments
of these should be given unchanged to `compadd' or `compgen' (if of these should be given unchanged to `compadd' (if they are not
they are not used by the helper function itself). used by the helper function itself).
6) When matches with a common prefix such as option names are generated, 6) When matches with a common prefix such as option names are generated,
add them *with* the prefix (like `-', `+', or `--' for options). add them *with* the prefix (like `-', `+', or `--' for options).
Then check the `prefix-needed' style to see if the matches are to be Then check the `prefix-needed' style to see if the matches are to be
@ -355,9 +356,9 @@ Misc. remarks
completely different modes), it should allow users to define completely different modes), it should allow users to define
functions that separately override the behavior for these functions that separately override the behavior for these
different types. This can easily be achieved by using the different types. This can easily be achieved by using the
`funcall' utility function, as in: `_funcall' utility function, as in:
funcall ret _command_$subcommand && return ret _funcall ret _command_$subcommand && return ret
This will try to call the function `_command_$subcommand' and if This will try to call the function `_command_$subcommand' and if
it exists, it will be called and the completion function exits it exists, it will be called and the completion function exits

View file

@ -18,14 +18,17 @@ incremental-complete-word() {
local key lbuf="$LBUFFER" rbuf="$RBUFFER" pmpt pstr word local key lbuf="$LBUFFER" rbuf="$RBUFFER" pmpt pstr word
local lastl lastr wid twid num alt post toolong local lastl lastr wid twid num alt post toolong
local curcontext="${curcontext}:incremental" stop brk local curcontext="${curcontext}" stop brk
zstyle -s ":completion${curcontext}" prompt pmpt || [[ -z "$curcontext" ]] && curcontext=:::
curcontext="${curcontext#*:}incremental:"
zstyle -s ":completion:${curcontext}" prompt pmpt ||
pmpt='incremental (%c): %u%s %l' pmpt='incremental (%c): %u%s %l'
zstyle -s ":completion${curcontext}" stop stop zstyle -s ":completion:${curcontext}" stop stop
zstyle -s ":completion${curcontext}" break brk zstyle -s ":completion:${curcontext}" break brk
if zstyle -t ":completion${curcontext}" list; then if zstyle -t ":completion:${curcontext}" list; then
wid=list-choices wid=list-choices
post=( icw-list-helper ) post=( icw-list-helper )
else else

View file

@ -53,7 +53,10 @@ insert-and-predict () {
unsetopt automenu recexact unsetopt automenu recexact
integer curs=$CURSOR pos nchar=${#LBUFFER//[^${KEYS[-1]}]} integer curs=$CURSOR pos nchar=${#LBUFFER//[^${KEYS[-1]}]}
local -a +h comppostfuncs local -a +h comppostfuncs
local crs curcontext="${curcontext}:predict" local crs curcontext="${curcontext}"
[[ -z "$curcontext" ]] && curcontext=:::
curcontext="${curcontext#*:}predict:"
comppostfuncs=( predict-limit-list ) comppostfuncs=( predict-limit-list )
zle complete-word zle complete-word
@ -61,7 +64,7 @@ insert-and-predict () {
# get out of that `case'. # get out of that `case'.
repeat 1 repeat 1
do do
zstyle -s ":completion${curcontext}" cursor crs zstyle -s ":completion:${curcontext}" cursor crs
case $crs in case $crs in
(complete) (complete)
# At the place where the completion left it, if it is after # At the place where the completion left it, if it is after
@ -119,7 +122,7 @@ predict-limit-list() {
then then
compstate[list]='' compstate[list]=''
compstate[force_list]=yes compstate[force_list]=yes
elif zstyle -t ":completion:predict${curcontext}" list always elif zstyle -t ":completion:predict::::" list always
then then
compstate[force_list]=yes compstate[force_list]=yes
fi fi