about summary refs log tree commit diff
path: root/Completion/compdump
blob: e0316fb6a75efeb6df447f657e01afbd92c99dc8 (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# This is a function to dump the definitions for new-style
# completion defined by 'compinit' in the same directory.  The output
# should be directed into the "compinit.dump" in the same directory as
# compinit. If you rename init, just stick .dump onto the end of whatever
# you have called it and put it in the same directory.  This is handled
# automatically if you invoke compinit with the option -d.
#
# You will need to update the dump every time you add a new completion.
# To do this, simply remove the .dump file, start a new shell, and
# create the .dump file as before.  Again, compinit -d handles this
# automatically.

# Print the number of files used for completion. This is used in compinit
# to see if auto-dump should re-dump the dump-file.

emulate -L zsh
setopt extendedglob noshglob

typeset _d_file _d_f _d_bks _d_line _d_als _d_files

_d_file=${_comp_dumpfile-${0:h}/compinit.dump}.$HOST.$$
[[ $_d_file = //* ]] && _d_file=${_d_file[2,-1]}

[[ -w ${_d_file:h} ]] || return 1

_d_files=( ${^~fpath:/.}/^([^_]*|*~|*.zwc)(N) )

if [[ -n "$_comp_secure" ]]; then
  _d_wdirs=( ${^fpath}(Nf:g+w:,f:o+w:,^u0u${EUID}) )
  _d_wfiles=( ${^~fpath:/.}/^([^_]*|*~|*.zwc)(N^u0u${EUID}) )

  (( $#_d_wfiles )) && _d_files=( "${(@)_d_files:#(${(j:|:)_d_wfiles})}"  )
  (( $#_d_wdirs ))  && _d_files=( "${(@)_d_files:#(${(j:|:)_d_wdirs})/*}" )
fi

print "#files: $#_d_files" > $_d_file

# First dump the arrays _comps, _services and _patcomps.  The quoting
# hieroglyphics ensure that a single quote inside a variable is itself
# correctly quoted.

print "_comps=(" >> $_d_file
for _d_f in ${(ok)_comps}; do
    print -r - "${(q)_d_f}" "${(q)_comps[$_d_f]}"
done  >> $_d_file
print ")" >> $_d_file

print "_services=(" >> $_d_file
for _d_f in ${(ok)_services}; do
    print -r - "${(q)_d_f}" "${(q)_services[$_d_f]}"
done  >> $_d_file
print ")" >> $_d_file

print "\n_patcomps=(" >> $_d_file
for _d_f in "${(ok@)_patcomps}"; do
  print -r - "${(q)_d_f}" "${(q)_patcomps[$_d_f]}"
done >> $_d_file
print ")" >> $_d_file

print "\n_postpatcomps=(" >> $_d_file
for _d_f in "${(ok@)_postpatcomps}"; do
  print -r - "${(q)_d_f}" "${(q)_postpatcomps[$_d_f]}"
done >> $_d_file
print ")" >> $_d_file

print "\n_compautos=(" >> $_d_file
for _d_f in "${(ok@)_compautos}"; do
  print -r - "${(q)_d_f}" "${(q)_compautos[$_d_f]}"
done >> $_d_file
print ")" >> $_d_file

print >> $_d_file

# Now dump the key bindings. We dump all bindings for zle widgets
# whose names start with a underscore.
# We need both the zle -C's and the bindkey's to recreate.
# We can ignore any zle -C which rebinds a standard widget (second
# argument to zle does not begin with a `_').

_d_bks=()
_d_complist=
zle -lL |
  while read -rA _d_line; do
    if [[ ${_d_line[3]} = _* && ${_d_line[5]} = _* ]]; then
      if [[ -z "$_d_complist" && ${_d_line[4]} = .menu-select ]]; then
        print 'zmodload -i zsh/complist'
	d_complist=yes
      fi
      print -r - ${_d_line}
      _d_bks=($_d_bks ${_d_line[3]})
    fi
  done >> $_d_file
bindkey |
  while read -rA _d_line; do
    if [[ ${_d_line[2]} = (${(j.|.)~_d_bks}) ]]; then
      print -r "bindkey '${_d_line[1][2,-2]}' ${_d_line[2]}"
    fi
  done >> $_d_file

print >> $_d_file


# Autoloads: look for all functions beginning with `_'.

_d_als=(${(o)$(typeset +fm '_*')})

# print them out:  about five to a line looks neat

_i=5
print -n autoload -U >> $_d_file
while (( $#_d_als )); do
  if (( ! $+_compautos[$_d_als[1]] )); then
    print -n " $_d_als[1]"
    if (( ! --_i && $#_d_als > 1 )); then
      _i=5
      print -n ' \\\n           '
    fi
  fi
  shift _d_als
done >> $_d_file

print >> $_d_file

for _i in "${(ok@)_compautos}"; do
  print "autoload -U $_compautos[$_i] $_i" >> $_d_file
done

mv $_d_file ${_d_file%.$HOST.$$}

unfunction compdump
autoload -U compdump