about summary refs log tree commit diff
path: root/Completion/Builtins
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-11-12 15:28:24 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-11-12 15:28:24 +0000
commite6282df1155e8d9b08b2e518a452c1997973f1ce (patch)
treeb0c8ed7e8512cc4397ae7df6d138ea66147565b3 /Completion/Builtins
parent167b0ae3b98938f75287dcf2e112d41a03532c5f (diff)
downloadzsh-e6282df1155e8d9b08b2e518a452c1997973f1ce.tar.gz
zsh-e6282df1155e8d9b08b2e518a452c1997973f1ce.tar.xz
zsh-e6282df1155e8d9b08b2e518a452c1997973f1ce.zip
manual/8630
Diffstat (limited to 'Completion/Builtins')
-rw-r--r--Completion/Builtins/_aliases7
-rw-r--r--Completion/Builtins/_arrays2
-rw-r--r--Completion/Builtins/_autoload2
-rw-r--r--Completion/Builtins/_bindkey4
-rw-r--r--Completion/Builtins/_builtin2
-rw-r--r--Completion/Builtins/_cd7
-rw-r--r--Completion/Builtins/_command2
-rw-r--r--Completion/Builtins/_compdef4
-rw-r--r--Completion/Builtins/_disable29
-rw-r--r--Completion/Builtins/_echotc2
-rw-r--r--Completion/Builtins/_enable29
-rw-r--r--Completion/Builtins/_functions2
-rw-r--r--Completion/Builtins/_hash8
-rw-r--r--Completion/Builtins/_kill4
-rw-r--r--Completion/Builtins/_limits2
-rw-r--r--Completion/Builtins/_pids13
-rw-r--r--Completion/Builtins/_popd55
-rw-r--r--Completion/Builtins/_sched11
-rw-r--r--Completion/Builtins/_stat2
-rw-r--r--Completion/Builtins/_trap2
-rw-r--r--Completion/Builtins/_unhash28
-rw-r--r--Completion/Builtins/_wait2
-rw-r--r--Completion/Builtins/_which20
-rw-r--r--Completion/Builtins/_zftp14
-rw-r--r--Completion/Builtins/_zle2
-rw-r--r--Completion/Builtins/_zmodload3
26 files changed, 149 insertions, 109 deletions
diff --git a/Completion/Builtins/_aliases b/Completion/Builtins/_aliases
index 8764f7f66..a097d020e 100644
--- a/Completion/Builtins/_aliases
+++ b/Completion/Builtins/_aliases
@@ -2,7 +2,6 @@
 
 local expl
 
-_description expl 'regular alias'
-compadd "$expl[@]" - "${(@k)aliases}"
-_description expl 'global alias'
-compadd "$expl[@]" - "${(@k)galiases}"
+_alternative any:argument \
+  'aliases:regular alias:compadd - ${(@k)aliases}' \
+  'global-aliases:global alias:compadd - ${(@k)galiases}'
diff --git a/Completion/Builtins/_arrays b/Completion/Builtins/_arrays
index a2aa813b6..37eb20bf5 100644
--- a/Completion/Builtins/_arrays
+++ b/Completion/Builtins/_arrays
@@ -2,5 +2,7 @@
 
 local expl
 
+_tags any:argument arrays || return 1
+
 _description expl array
 compadd "$expl[@]" - "${(@k)parameters[(R)*array*]}"
diff --git a/Completion/Builtins/_autoload b/Completion/Builtins/_autoload
index 4a97b2aec..116bb7765 100644
--- a/Completion/Builtins/_autoload
+++ b/Completion/Builtins/_autoload
@@ -2,5 +2,7 @@
 
 local expl
 
+_tags any:argument functions || return 1
+
 _description expl 'shell function'
 compadd "$expl[@]" - ${^fpath}/*(N:t)
diff --git a/Completion/Builtins/_bindkey b/Completion/Builtins/_bindkey
index b60dafbb2..31215a576 100644
--- a/Completion/Builtins/_bindkey
+++ b/Completion/Builtins/_bindkey
@@ -10,9 +10,13 @@
 local expl
 
 if [[ "$words[2]" = -*[DAN]* || "$words[CURRENT-1]" = -*M ]]; then
+  _tags -M keymaps || return 1
+
   _description expl keymap
   compadd "$expl[@]" - "$keymaps[@]"
 else
+  _tags any:argument widgets || return 1
+
   _description expl widget
   compadd "$expl[@]" -M 'r:|-=* r:|=*' - "${(@k)widgets}"
 fi
diff --git a/Completion/Builtins/_builtin b/Completion/Builtins/_builtin
index cf02093bb..fcb20560f 100644
--- a/Completion/Builtins/_builtin
+++ b/Completion/Builtins/_builtin
@@ -7,6 +7,8 @@ if (( $CURRENT > 2 )); then
 else
   local expl
 
+  _tags any:command commands || return 1
+
   _description expl 'builtin command'
   compadd "$expl[@]" "$@" - "${(k@)builtins}"
 fi
diff --git a/Completion/Builtins/_cd b/Completion/Builtins/_cd
index b407b5a85..26846fde2 100644
--- a/Completion/Builtins/_cd
+++ b/Completion/Builtins/_cd
@@ -22,10 +22,13 @@ if [[ CURRENT -eq 3 ]]; then
   rep=(${~PWD/$words[2]/*}~$PWD(-/N))
   # Now remove all the common parts of $PWD and the completions from this
   rep=(${${rep#${PWD%%$words[2]*}}%${PWD#*$words[2]}})
-  _description expl replacement
-  (( ! $#rep )) || compadd "$expl[@]" $rep
+  if (( $#rep )) && _tags replacement strings; then
+    _description expl replacement
+    compadd "$expl[@]" $rep
+  fi
 elif _popd || [[ $PREFIX != (\~|/|./|../)* && $#cdpath -ne 0 ]]; then
   local tdir tdir2
+
   # With cdablevars, we can convert foo/bar/... to ~foo/bar/... if
   # there is no directory foo.  In that case we could also complete
   # variable names, but it hardly seems worth it.
diff --git a/Completion/Builtins/_command b/Completion/Builtins/_command
index 9f54aae80..23995dbbe 100644
--- a/Completion/Builtins/_command
+++ b/Completion/Builtins/_command
@@ -6,6 +6,8 @@ if [[ CURRENT -ge 3 ]]; then
 else
   local expl
 
+  _tags any:command commands || return 1
+
   _description expl 'external command'
   compadd "$expl[@]" "$@" - "${(k@)commands}"
 fi
diff --git a/Completion/Builtins/_compdef b/Completion/Builtins/_compdef
index 4208c2689..df25d44de 100644
--- a/Completion/Builtins/_compdef
+++ b/Completion/Builtins/_compdef
@@ -12,10 +12,14 @@ while [[ $words[base] = -* ]]; do
 done
 
 if [ "$delete" ]; then
+  _tags any:argument commands || return 1
+
   _description expl 'completed command'
   compadd "$expl[@]" - ${(k)_comps}
 else
   if [[ CURRENT -eq base ]]; then
+    _tags any:argument functions || return 1
+
     _description expl 'completion function'
     compadd "$expl[@]" - ${^fpath:/.}/_(|*[^~])(N:t)
   else
diff --git a/Completion/Builtins/_disable b/Completion/Builtins/_disable
index af4805c25..33c202864 100644
--- a/Completion/Builtins/_disable
+++ b/Completion/Builtins/_disable
@@ -1,22 +1,15 @@
 #compdef disable
 
-local prev="$words[CURRENT-1]" ret=1 expl
+local prev="$words[CURRENT-1]" args
 
-if [[ "$prev" = -*a* ]]; then
-  _description expl alias
-  compadd "$expl[@]" "$@" - "${(k@)aliases}" && ret=0
-fi
-if [[ "$prev" = -*f* ]]; then
-  _description expl 'shell function'
-  compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
-fi
-if [[ "$prev" = -*r* ]]; then
-  _description expl 'reserved word'
-  compadd "$expl[@]" "$@" - "${(k@)reswords}" && ret=0
-fi
-if [[ "$prev" != -* ]]; then
-  _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
-fi
+args=()
+[[ "$prev" = -*a* ]] &&
+    tags=( 'aliases:alias:compadd - ${(@k)aliases} ${(@k)galiases} )
+[[ "$prev" = -*f* ]] &&
+    tags=( "$tags[@]" 'functions:shell function:compadd - ${(@k)functions}' )
+[[ "$prev" = -*r* ]] &&
+    tags=( "$tags[@]" 'reserved-words:reserved word:compadd - ${(@k)reswords}' )
+[[ "$prev" != -* ]]  &&
+    tags=( 'builtins:builtin command:compadd - ${(@k)builtins} )
 
-return ret
+_alternative any "$args[@]"
diff --git a/Completion/Builtins/_echotc b/Completion/Builtins/_echotc
index 46bf38261..2193261a1 100644
--- a/Completion/Builtins/_echotc
+++ b/Completion/Builtins/_echotc
@@ -2,6 +2,8 @@
 
 local expl
 
+_tags any:argument capabilities || return 1
+
 _description expl 'terminal capability'
 compadd "$expl[@]" \
         al dc dl do le up al bl cd ce cl cr dc dl do ho is le ma nd nl se so up
diff --git a/Completion/Builtins/_enable b/Completion/Builtins/_enable
index 7d15e9121..ae2bdc38c 100644
--- a/Completion/Builtins/_enable
+++ b/Completion/Builtins/_enable
@@ -1,22 +1,15 @@
 #compdef enable
 
-local prev="$words[CURRENT-1]" ret=1 expl
+local prev="$words[CURRENT-1]" args
 
-if [[ "$prev" = -*a* ]]; then
-  _description expl alias
-  compadd "$expl[@]" "$@" - "${(k@)dis_aliases}" "${(k@)dis_galiases}" && ret=0
-fi
-if [[ "$prev" = -*f* ]]; then
-  _description expl 'shell function'
-  compadd "$expl[@]" "$@" - "${(k@)dis_functions}" && ret=0
-fi
-if [[ "$prev" = -*r* ]]; then
-  _description expl 'reserved word'
-  compadd "$expl[@]" "$@" - "${(k@)dis_reswords}" && ret=0
-fi
-if [[ "$prev" != -* ]]; then
-  _description expl 'builtin command'
-  compadd "$expl[@]" "$@" - "${(k@)dis_builtins}" && ret=0
-fi
+args=()
+[[ "$prev" = -*a* ]] &&
+    tags=( 'aliases:alias:compadd - ${(@k)dis_aliases} ${(@k)dis_galiases} )
+[[ "$prev" = -*f* ]] &&
+    tags=( "$tags[@]" 'functions:shell function:compadd - ${(@k)dis_functions}' )
+[[ "$prev" = -*r* ]] &&
+    tags=( "$tags[@]" 'reserved-words:reserved word:compadd - ${(@k)dis_reswords}' )
+[[ "$prev" != -* ]]  &&
+    tags=( 'builtins:builtin command:compadd - ${(@k)dis_builtins} )
 
-return ret
+_alternative any "$args[@]"
diff --git a/Completion/Builtins/_functions b/Completion/Builtins/_functions
index 81a56eb83..9e6925ce7 100644
--- a/Completion/Builtins/_functions
+++ b/Completion/Builtins/_functions
@@ -2,5 +2,7 @@
 
 local expl
 
+_tags argument:any functions || return 1
+
 _description expl 'shell function'
 compadd "$expl[@]" "$@" - "${(k@)functions}"
diff --git a/Completion/Builtins/_hash b/Completion/Builtins/_hash
index 4cb72b09c..24a9964b9 100644
--- a/Completion/Builtins/_hash
+++ b/Completion/Builtins/_hash
@@ -4,15 +4,23 @@ local expl
 
 if [[ "$words[2]" = -*d* ]]; then
   if compset -P 1 '*\='; then
+    _tags - -d-value files || return 1
+
     _path_files -g '*(-/)'
   else
+    _tags - -d named-directories || return 1
+
     _description expl 'named directory'
     compadd "$expl[@]" -q -S '=' - "${(@k)nameddirs}"
   fi
 elif compset -P 1 '*\='; then
+  _tags value executables || return 1
+
   _description expl 'executable file'
   _files "$expl[@]" -g '*(*)'
 else
+  _tags any:argument commands || return 1
+
   _description expl command
   compadd "$expl[@]" -q -S '=' - "${(@k)commands}"
 fi
diff --git a/Completion/Builtins/_kill b/Completion/Builtins/_kill
index 43ff40838..e2dc88dac 100644
--- a/Completion/Builtins/_kill
+++ b/Completion/Builtins/_kill
@@ -4,10 +4,10 @@ local list expl
 
 if compset -P 1 -; then
 
-  _tags signal || return 1
+  _tags - -:signal signals || return 1
 
   _description expl signal
   compadd "$expl[@]" $signals[1,-3]
 else
-  _alternative 'job:: _jobs' 'process:: _pids'
+  _alternative argument 'jobs:: _jobs' 'processes:: _pids'
 fi
diff --git a/Completion/Builtins/_limits b/Completion/Builtins/_limits
index 0072438c3..12e90e96a 100644
--- a/Completion/Builtins/_limits
+++ b/Completion/Builtins/_limits
@@ -2,5 +2,7 @@
 
 local expl
 
+_tags any:argument limits || return 1
+
 _description expl 'process limits'
 compadd "$expl[@]" ${${(f)"$(limit)"}%% *}
diff --git a/Completion/Builtins/_pids b/Completion/Builtins/_pids
index 0ffda900b..f96c11e2d 100644
--- a/Completion/Builtins/_pids
+++ b/Completion/Builtins/_pids
@@ -3,7 +3,9 @@
 # If given the `-m <pattern>' option, this tries to complete only pids
 # of processes whose command line match the `<pattern>'.
 
-local list expl match
+local list expl match desc
+
+_tags any processes || return 1
 
 if [[ "$1" = -m ]]; then
   match="${2}*"
@@ -12,7 +14,12 @@ fi
 
 _description expl 'process ID'
 
-list=("${(@Mr:COLUMNS-1:)${(f@)$(ps ${=compconfig[ps_listargs]:-$=compconfig[ps_args]} 2>/dev/null)}[2,-1]:#[ 	]#${PREFIX}[0-9]#${SUFFIX}[ 	]*${~match}}")
+if _style processes description yes; then
+  list=("${(@Mr:COLUMNS-1:)${(f@)$(ps ${=compconfig[ps_listargs]:-$=compconfig[ps_args]} 2>/dev/null)}[2,-1]:#[ 	]#${PREFIX}[0-9]#${SUFFIX}[ 	]*${~match}}")
+  desc=(-ld list)
+else
+  desc=()
+fi
 
-compadd "$expl[@]" "$@" -ld list - \
+compadd "$expl[@]" "$@" "$desc[@]" - \
   ${${${(M)${(f)"$(ps $=compconfig[ps_args] 2>/dev/null)"}[2,-1]:#*${~match}}## #}%% *}
diff --git a/Completion/Builtins/_popd b/Completion/Builtins/_popd
index 9054befb7..5e4910f48 100644
--- a/Completion/Builtins/_popd
+++ b/Completion/Builtins/_popd
@@ -5,36 +5,39 @@
 # way round if pushdminus is set). Note that this function is also called
 # from _cd for cd and pushd.
 
-emulate -L zsh
 setopt extendedglob nonomatch
 
-[[ $PREFIX = [-+]* ]] || return 1
+_tags any directory-stack || return 1
 
-local expl list lines revlines ret=1 i
+! _style directory-stack prefix-needed yes ||
+    [[ $PREFIX = [-+]* ]] || return 1
 
-IPREFIX=$PREFIX[1]
-PREFIX=$PREFIX[2,-1]
+local expl list lines revlines disp
 
-# get the list of directories with their canonical number
-# and turn the lines into an array, removing the current directory
-lines=( ${${(f)"$(dirs -v)"}##0*} )
-if [[ ( $IPREFIX = - && ! -o pushdminus ) ||
-      ( $IPREFIX = + && -o pushdminus ) ]]; then
-  integer i
-  revlines=( $lines )
-  for (( i = 1; i <= $#lines; i++ )); do
-    lines[$i]="$((i-1)) -- ${revlines[-$i]##[0-9]#[	 ]#}"
-  done
+if _style directory-stack description yes; then
+  # get the list of directories with their canonical number
+  # and turn the lines into an array, removing the current directory
+  lines=("${PWD}" "${dirstack[@]}")
+
+  if [[ ( $PREFIX[1] = - && ! -o pushdminus ) ||
+        ( $PREFIX[1] = + && -o pushdminus ) ]]; then
+    integer i
+    revlines=( $lines )
+    for (( i = 1; i <= $#lines; i++ )); do
+      lines[$i]="$((i-1)) -- ${revlines[-$i]##[0-9]#[	 ]#}"
+    done
+  else
+    for (( i = 1; i <= $#lines; i++ )); do
+      lines[$i]="$i -- ${lines[$i]##[0-9]#[	 ]#}"
+    done
+  fi
+  # get the array of numbers only
+  list=( ${PREFIX[1]}${^lines%% *} )
+  disp=( -ld lines )
 else
-  for (( i = 1; i <= $#lines; i++ )); do
-    lines[$i]="$i -- ${lines[$i]##[0-9]#[	 ]#}"
-  done
+  list=( ${PREFIX[1]}{0..${#dirstack}} )
+  disp=()
 fi
-# get the array of numbers only
-list=(${lines%% *})
-_description expl 'directory stack index'
-compadd "$expl[@]" -ld lines -V dirs -Q - "$list[@]" && ret=0
-[[ -z $compstate[list] ]] && compstate[list]=list && ret=0
-[[ -n $compstate[insert] ]] && compstate[insert]=menu && ret=0
-
-return ret
+
+_description -V expl 'directory stack index'
+compadd "$expl[@]" "$@" -qS/ "$disp[@]" -Q - "$list[@]"
diff --git a/Completion/Builtins/_sched b/Completion/Builtins/_sched
index 38bf44a59..d3245f7ef 100644
--- a/Completion/Builtins/_sched
+++ b/Completion/Builtins/_sched
@@ -1,12 +1,19 @@
 #compdef sched
 
-local expl lines
+local expl lines disp
 
 if [[ CURRENT -eq 2 ]]; then
   if compset -P -; then
+    _tags - - entries || return 1
+
     lines=(${(f)"$(sched)"})
+    if _style entries description yes; then
+      disp=( -ld lines )
+    else
+      disp=()
+    fi
     _description expl 'scheduled jobs'
-    [[ -z $lines ]] || compadd "$expl[@]" -ld lines - {1..$#lines}
+    [[ -z $lines ]] || compadd "$expl[@]" "$disp[@]" - {1..$#lines}
   else
     _message 'time specification'
     return 1
diff --git a/Completion/Builtins/_stat b/Completion/Builtins/_stat
index 322f042ec..3f1b62ca3 100644
--- a/Completion/Builtins/_stat
+++ b/Completion/Builtins/_stat
@@ -5,6 +5,8 @@ local expl
 if [[ "$words[CURRENT-1]" = -[AH] ]]; then
   _arrays
 else
+  _tags any:argument elements || return 1
+
   _description expl 'inode element'
   [[ "$PREFIX[1]" = + ]] &&
       compadd "$expl[@]" - +device +inode +mode +nlink +uid +gid +rdev +size \
diff --git a/Completion/Builtins/_trap b/Completion/Builtins/_trap
index 0f0209914..5dbb2d284 100644
--- a/Completion/Builtins/_trap
+++ b/Completion/Builtins/_trap
@@ -6,6 +6,8 @@ if [[ CURRENT -eq 2 ]]; then
   compset -q
   _normal
 else
+  _tags any:argument signals || return 1
+
   _description expl signal
   compadd "$expl[@]" - "$signals[@]"
 fi
diff --git a/Completion/Builtins/_unhash b/Completion/Builtins/_unhash
index a23fd9025..6ccbc21a4 100644
--- a/Completion/Builtins/_unhash
+++ b/Completion/Builtins/_unhash
@@ -1,22 +1,14 @@
 #compdef unhash
 
-local fl="$words[2]" ret=1 expl
+local fl="$words[2]" args
 
-if [[ "$fl" = -*d* ]]; then
-  _description expl 'named directory'
-  compadd "$expl[@]" - "${(@k)nameddirs}" && ret=0
-fi
-if [[ "$fl" = -*a* ]]; then
-  _description expl alias
-  compadd "$expl[@]" - "${(@k)aliases}" "${(@k)dis_aliases}" \
-                       "${(@k)galiases}" "${(@k)dis_galiases}" && ret=0
-fi
-if [[ "$fl" = -*f* ]]; then
-  _description expl 'shell function'
-  compadd "$expl[@]" - "${(@k)functions}" "${(@k)dis_functions}" && ret=0
-fi
-if [[ "$fl" != -* ]]; then
-  _command_names -e && ret=0
-fi
+args=()
+[[ "$fl" = -*d* ]] &&
+    args=( 'named-directories:named directory:compadd - ${(@k)nameddirs}' )
+[[ "$fl" = -*a* ]] &&
+    args=( "$args[@]"
+           'aliases:alias:compadd - ${(@k)aliases} ${(@k)galiases} ${(@k)dis-aliases} ${(@k)dis-galiases}' )
+[[ "$fl != -* ]] &&
+    args=( 'commands:: _command_names -e' )
 
-return ret
+_alternative any:argument "$args[@]"
diff --git a/Completion/Builtins/_wait b/Completion/Builtins/_wait
index c1022a25f..04ad5e873 100644
--- a/Completion/Builtins/_wait
+++ b/Completion/Builtins/_wait
@@ -1,3 +1,3 @@
 #compdef wait
 
-_alternative 'job:: _jobs' 'process:: _pids'
+_alternative argument:any 'jobs:: _jobs' 'processes:: _pids'
diff --git a/Completion/Builtins/_which b/Completion/Builtins/_which
index 41e7d20fd..6e9e0a460 100644
--- a/Completion/Builtins/_which
+++ b/Completion/Builtins/_which
@@ -1,14 +1,12 @@
 #compdef which whence where type
 
-local expl
+local args
 
-_description expl 'external command'
-compadd "$expl[@]" "$@" - "${(k@)commands}" && ret=0
-_description expl 'builtin command'
-compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
-_description expl 'shell function'
-compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
-_description expl 'alias'
-compadd "$expl[@]" "$@" - "${(k@)aliases}" && ret=0
-_description expl 'reserved word'
-compadd "$expl[@]" "$@" - "${(k@)reswords}" && ret=0
+args=( "$@" )
+
+_alternative -O args any:argument \
+  'commands:external command:compadd - ${(k@)commands}' \
+  'builtins:builtin command:compadd - ${(k@)builtins}' \
+  'functions:shell function:compadd - ${(k@)functions}' \
+  'aliases:alias:compadd - ${(k@)aliases}' \
+  'reserved-words:reserved word:compadd - ${(k@)reswords}'
diff --git a/Completion/Builtins/_zftp b/Completion/Builtins/_zftp
index 7aa1d94e8..2728d1747 100644
--- a/Completion/Builtins/_zftp
+++ b/Completion/Builtins/_zftp
@@ -13,6 +13,8 @@ local subcom expl
 
 if [[ $words[1] = zftp ]]; then
   if [[ $CURRENT -eq 2 ]]; then
+    _tags command commands || return 1
+
     _description expl sub-command
     compadd "$expl[@]" open params user login type ascii binary mode put \
       putat get getat append appendat ls dir local remote mkdir rmdir \
@@ -27,26 +29,27 @@ fi
 case $subcom in
   *(cd|ls|dir))
     # complete remote directories
-    zfcd_match $PREFIX $SUFFIX
+    _tags "$subcom" directories && zfcd_match $PREFIX $SUFFIX
     ;;
 
   *(get(|at)|gcp|delete|remote))
     # complete remote files
-    zfget_match $PREFIX $SUFFIX
+    _tags "$subcom" files && zfget_match $PREFIX $SUFFIX
     ;;
 
   *(put(|at)|pcp))
     # complete local files
-    _files
+    _tags "$subcom" files && _files
     ;;
 
   *(open|anon|params))
     # complete hosts:  should do cleverer stuff with user names
-    _hosts
+    _tags "$subcom" hosts && _hosts
     ;;
 
   *(goto|mark))
     # complete bookmarks.  First decide if ncftp mode is go.
+    _tags "$subcom" bookmarks || return 1
     _description expl bookmark
     if [[ $words[2] = -*n* ]]; then
       if [[ -f ~/.ncftp/bookmarks ]]; then
@@ -61,6 +64,7 @@ case $subcom in
 
   *session)
     # complete sessions, excluding the current one.
+    _tags "$subcom" sessions || return 1
     _description expl 'another FTP session'
     compadd "$expl[@]" - ${$(zftp session):#$ZFTP_SESSION}
     ;;
@@ -69,6 +73,7 @@ case $subcom in
     # complete arguments like sess1:file1 sess2:file2
     if [[ $PREFIX = *:* ]]; then
       # complete file in the given session
+      _tags "$subcom" files || return 1
       local sess=${PREFIX%%:*} oldsess=$ZFTP_SESSION
       compset -p $(( $#sess + 1 ))
       [[ -n $sess ]] && zftp session $sess
@@ -76,6 +81,7 @@ case $subcom in
       [[ -n $sess && -n $oldsess ]] && zftp session $oldsess
     else
       # note here we can complete the current session
+      _tags "$subcom" sessions || return 1
       _description expl 'FTP session'
       compadd "$expl[@]" -S : - $(zftp session)
     fi
diff --git a/Completion/Builtins/_zle b/Completion/Builtins/_zle
index a153aabdd..21997ef62 100644
--- a/Completion/Builtins/_zle
+++ b/Completion/Builtins/_zle
@@ -3,9 +3,11 @@
 local expl
 
 if [[ "$words[2]" = -N && CURRENT -eq 3 ]]; then
+  _tags any:argument functions || return 1
   _description expl 'widget shell function'
   compadd "$expl[@]" "$@" - "${(k@)functions}" && ret=0
 else
+  _tags any:argument widgets || return 1
   _description expl widget
   compadd "$expl[@]" - "${(@k)widgets}"
 fi
diff --git a/Completion/Builtins/_zmodload b/Completion/Builtins/_zmodload
index 097911307..1a1097a7a 100644
--- a/Completion/Builtins/_zmodload
+++ b/Completion/Builtins/_zmodload
@@ -3,12 +3,15 @@
 local fl="$words[2]" expl
 
 if [[ "$fl" = -*(a*u|u*a)* || "$fl" = -*a* && CURRENT -ge 4 ]]; then
+  _tags any:argument builtins || return 1
   _description expl 'builtin command'
   compadd "$expl[@]" "$@" - "${(k@)builtins}" && ret=0
 elif [[ "$fl" = -*u* ]]; then
+  _tags any:argument modules || return 1
   _description expl module
   compadd "$expl[@]" - "${(@k)modules}"
 else
+  _tags any:argument files || return 1
   _description expl 'module file'
   compadd "$expl[@]" - ${^module_path}/*.s[ol](N:t:r)
 fi