#compdef -p */(init|rc[0-9S]#).d/* local magic cmds what script _compskip=all # This should probably be system specific... script=$words[1] if [[ $script != */* ]]; then local -a scriptpath local dir # Known locations of init scripts # C.f. Unix/Type/_services scriptpath=(/etc/init.d /etc/rc.d /etc/rc.d/init.d) for dir in $scriptpath; do if [[ -f $dir/$script ]]; then script=$dir/$script break fi done fi # If the file starts with `#!' we hope that this is a shell script # and get lines looking like foo|bar) with the words in $what. what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)' read -u0 -k2 magic < $script && [[ $magic = '#!' ]] && cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)${~what}([[:blank:]]#\|[[:blank:]]#${~what})#(\'|)\)}}//[^-a-z_]} ) # This would be the pattern to use every line of the form foo). # Some people say this might match too many lines... # # cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} ) (( $#cmds )) || zstyle -a ":completion:${curcontext}:commands" commands cmds || cmds=(start stop) _sub_commands $cmds