# This is a file to be sourced 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. # # It relies on KSH_ARRAYS not being set. # Print the number of files used for completion. This is used in compinit # to see if auto-dump should re-dump the dump-file. _d_file=${compconfig[dumpfile]-${0:h}/compinit.dump} typeset -U _d_files _d_files=( ${^~fpath}/_*~*~(N:t) ) print "#files: $#_d_files" > $_d_file unset _d_files # First dump the arrays _comps and _patcomps. The quoting hieroglyphyics # 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 - "'${_d_f//\'/'\\''}'" "'${_comps[$_d_f]//\'/'\\''}'" done >> $_d_file print ")" >> $_d_file print "\n_patcomps=(" >> $_d_file for _d_f in "$_patcomps[@]"; do print -r - "'${_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. _d_bks=() zle -lL | while read -rA _d_line; do if [[ ${_d_line[5]} = _* ]]; then 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: whence -w produces "_d_foo: function", so look for # all functions beginning with `_'. _d_als=($(whence -wm '_*' | sort | while read -rA _d_line; do [[ ${_d_line[2]} = function ]] && print -r - ${_d_line[1]%:} done)) # print them out: about five to a line looks neat while (( $#_d_als )); do print -n autoload for (( _i = 0; _i < 5; _i++ )); do if (( $#_d_als )); then print -n " $_d_als[1]" shift _d_als fi done print done >> $_d_file print >> $_d_file unset _d_line _d_zle _d_bks _d_als _d_f _f_file