about summary refs log tree commit diff
path: root/Completion/Commands/_complete_help
blob: 2d2ba52d9f2470b269d878f9275c47c6a8ae66ce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#compdef -k complete-word \C-xh

_complete_help() {
  setopt localoptions $_comp_options

  exec </dev/null	# ZLE closes stdin, which can cause errors

  local _sort_tags=_help_sort_tags text i j k
  typeset -A help_funcs help_tags help_sfuncs help_styles

  compadd() { return 1 }
  zstyle() {
    local _f="${${(@)${(@)funcstack[2,(i)_(main_complete|complete|approximate|normal)]}:#_(wanted|requested|all_labels|next_label)}% *}"

    [[ -z "$_f" ]] && _f="${${(@)funcstack[2,(i)_(main_complete|complete|approximate|normal)]}:#_(wanted|requested|all_labels|next_label)}"

    if [[ "$help_sfuncs[$2]" != *${_f}* ||
          "$help_styles[${2}${_f}]" != *${3}* ]]; then
      [[ "$help_sfuncs[$2]" != *${_f}* ]] &&
          help_sfuncs[$2]="${help_sfuncs[$2]}:${_f}"
      local _t

      case "$1" in
      -s) _t='[string] ';;
      -a) _t='[array]  ';;
      -h) _t='[assoc]  ';;
      *)  _t='[boolean]';;
      esac
      help_styles[${2}${_f}]="${help_styles[${2}${_f}]},${_t} ${3}:${_f}"
    fi

    # No need to call the completers more than once with different match specs.

    if [[ "$3" = matcher-list ]]; then
      set -A "$4" ''
    else
      builtin zstyle "$@"
    fi
  }

  _main_complete

  unfunction compadd zstyle

  for i in "${(@ok)help_funcs}"; do
    text="${text}
tags in context :completion:${i}:"
    tmp=()
    for j in "${(@s.:.)help_funcs[$i][2,-1]}"; do
      tmp=( "$tmp[@]" "${(@s.,.)help_tags[${i}${j}][2,-1]}" )
    done
    zformat -a tmp '  (' "$tmp[@]"
    tmp=( '
    '${^tmp}')' )
    text="${text}${tmp}"
  done

  if [[ ${NUMERIC:-1} -ne 1 ]]; then
    text="$text
"
    for i in "${(@ok)help_sfuncs}"; do
      text="${text}
styles in context ${i}"
      tmp=()
      for j in "${(@s.:.)help_sfuncs[$i][2,-1]}"; do
        tmp=( "$tmp[@]" "${(@s.,.)help_styles[${i}${j}][2,-1]}" )
      done
      zformat -a tmp '  (' "$tmp[@]"
      tmp=( '
    '${^tmp}')' )
      text="${text}${tmp}"
    done
  fi
  compstate[list]='list force'
  compstate[insert]=''

  compadd -UX "$text[2,-1]" -n ''
}

_help_sort_tags() {
  local f="${${(@)${(@)funcstack[3,(i)_(main_complete|complete|approximate|normal)]}:#_(wanted|requested|all_labels|next_label)}% *}"

  if [[ "$help_funcs[$curcontext]" != *${f}* ||
        "$help_tags[${curcontext}${f}]" != *(${(j:|:)~argv})* ]]; then
    [[ "$help_funcs[$curcontext]" != *${f}* ]] &&
        help_funcs[$curcontext]="${help_funcs[$curcontext]}:${f}"
    help_tags[${curcontext}${f}]="${help_tags[${curcontext}${f}]},${argv}:${f}"
    comptry "$@"
  fi
}

_complete_help "$@"