From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11822 invoked by alias); 25 May 2011 17:35:21 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 29371 Received: (qmail 8971 invoked from network); 25 May 2011 17:35:17 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_PASS autolearn=ham version=3.3.1 Received-SPF: pass (ns1.primenet.com.au: SPF record at m.gmane.org designates 80.91.229.12 as permitted sender) X-Injected-Via-Gmane: http://gmane.org/ To: zsh-workers@zsh.org From: Bernhard Tittelbach Subject: zsh completion for upstart commands initctl start stop restart reload and status Date: Wed, 25 May 2011 19:17:18 +0200 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070007070603060300020205" X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: chello080109208103.3.graz.surfer.at User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.23) Gecko/20091001 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666 --------------070007070603060300020205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I wrote an extensive zsh completion script for initctl and it's aliases. It's based on Mildred original script from 2007 but updated for natty and with lot's of improvements. (had quite some fun, zsh is a great shell :-) It's also been thoroughly tested by myself and friends. So now I'm posting it here in the hope that it's helpful :-) File is attached and/or available here: http://paste.grml.org/429/ Cheers, Bernhard --------------070007070603060300020205 Content-Type: text/plain; name="_initctl" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="_initctl" #compdef initctl start stop restart reload status # Written by Bernhard Tittelbach # based on completion script by Mildred local -a common_args common_args=( '--session[use D-Bus session bus to connect to init daemon (for testing)]' '--system[talk via DBUS system bus instead of socket]' '(-q --quiet)'{-q,--quiet}'[reduce output to errors only]' '(-v --verbose)'{-v,--verbose}'[increase output to include informational messages]' '--dest=[D-Bus name for init, defaults to com.ubuntu.Upstart]' '--help[display help and exit]' '--version[output version information and exit]' ) # don't overwrite work that we might have already done if (( ${+_initctl_events_list} + ${+_initctl_eventargs_list} != 2 )); then typeset -g -a -U _initctl_events_list _initctl_eventargs_list fi # map each initctl function to a completion function local -A cmd_completion_funcs cmd_completion_funcs=( start startstop stop startstop restart startstop reload startstop show-config show-config status argjob emit emit check-config check-config ) # define fallback completion function local cmd_completion_default=basic # run show-config -e and if possible parse out all events and KEY= argumnts # otherwise provide some common values _initctl_fillarray_events_args () { setopt extendedglob local showconfig="$(initctl show-config -e 2>| /dev/null)" if [[ -n "$showconfig" ]]; then _initctl_events_list=() _initctl_eventargs_list=() for cline in "${(f)showconfig}"; do if [[ "$cline" == (#s)\ \ (stop\ on|start\ on|emit)\ (#b)([[:alpha:]-_]##)(*)(#e) ]]; then _initctl_events_list+=($match[1]) # this is a bit tricky, we take the string right of the matched event # and parse for \sUPPERCASE=\S (in perl-re syntax) substrings until there are no more matches # since we can't do multiple matches, we concatenated the remaing strings and try again local stml="$match[2]" while [[ "$stml" == (#b)(*)\ ([[:upper:]_]##\=)[^[:space:]](#b)(*) ]]; do _initctl_eventargs_list+=($match[2]) stml="$match[1] $match[3]" done unset stml fi done else _initctl_events_list=( socket login-session-start desktop-session-start virtual-filesystems local-filesystems remote-filesystems all-swaps filesystem mounting mounted net-device-up start-portmap runlevel unmounted-remote-filesystems ) _initctl_eventargs_list=( PRIMARY_DEVICE_FOR_DISPLAY= EXIT_STATUS= EXIT_SIGNAL= RUNLEVEL= MOUNTPOINT= TYPE= INTERFACE= ) fi return 0 } # list all upstart jobs, i.e. all files in /etc/init/ _initctl_helper_jobs() { _path_files -W "/etc/init/" -g "*.conf(.:r)" } # list events, generate array if necessary _initctl_known_events() { [[ ${#_initctl_events_list} -eq 0 ]] && _initctl_fillarray_events_args _values "Event" "$_initctl_events_list[@]" } # list events, allow multiple choices, generate array if necessary _initctl_multiple_known_events() { [[ ${#_initctl_events_list} -eq 0 ]] && _initctl_fillarray_events_args _values -s "," "Events" "$_initctl_events_list[@]" } # list KEY= arguments, generate array if necessary _initctl_known_eventargs() { [[ ${#_initctl_eventargs_list} -eq 0 ]] && _initctl_fillarray_events_args _values "Argument Keys" "$_initctl_eventargs_list[@]" } # describe and offer commands for initctl, then call matching completion function _initctl_command() { local cmds cmds=( start:"Start jobs" stop:"Stop jobs" restart:"Restart jobs" reload:"Send SIGHUP to process instance" status:"Query status of jobs" list:"List known jobs" emit:"Emit an event" reload-configuration:"tell init to reload config files (generally inotify is used)" version:"Request the version of the init daemon" log-priority:"Change the minimum priority of log messages from the init daemon" show-config:"Show start/stop/emit for processes" check-config:"Find jobs than can't be started" help:"display list of commands" ) if (( CURRENT == 1 )); then _describe -t command "initctl Commands" cmds fi local cmd=$words[1] local curcontext="${curcontext%:*}:initctl-${cmd}" _call_function ret _initctl_${cmd_completion_funcs[${cmd}]-${cmd_completion_default}} } # completion for start/stop/restart/reload i.e. anything that take one job and multiple KEY= arguments's _initctl_startstop() { _arguments \ '--no-wait[do not wait for operation to complete before exiting]' \ "${common_args[@]}" \ ':Upstart Jobs:_initctl_helper_jobs' \ '*::Argument Keys:_initctl_known_eventargs' } # completion for anything that takes one job _initctl_argjob() { _arguments \ "${common_args[@]}" \ ':Upstart Jobs:_initctl_helper_jobs' \ '*::' } # completion for emit, providing options, one event and multiple KEY= arguments's _initctl_emit() { _arguments \ '--no-wait[do not wait for event to finish before exiting]' \ "${common_args[@]}" \ ':Events:_initctl_known_events' \ '*::Argument Keys:_initctl_known_eventargs' } # the fallback, just the options _initctl_basic() { _arguments \ "${common_args[@]}" } # completion for show-config, additional option and one job _initctl_show-config() { _arguments \ "(-e --enumerate)"{-e,--enumerate}"[enumerate emit lines]" \ "${common_args[@]}" \ '::Upstart Jobs:_initctl_helper_jobs' \ '*::' } # completion for show-config, additional options and one job _initctl_check-config() { _arguments \ "(-i --ignore-events)"{-i,--ignore-events}"[list of comma-separated events to ignore]:Events:_initctl_multiple_known_events" \ "(-w --warn)"{-w,--warn}"[treat any unknown jobs or events as error]" \ "${common_args[@]}" \ '::Upstart Jobs:_initctl_helper_jobs' \ '*::' } # depending on which command was used, call different completion funtions case $service in initctl) _arguments "${common_args[@]}" '*::Initctl Commands:_initctl_command' ;; start|stop|restart|reload|status) _call_function ret _initctl_${cmd_completion_funcs[${service}]-${cmd_completion_default}} ;; *) return 1 ;; esac --------------070007070603060300020205--