Hi,
The attached patch adds support for FreeBSD's rc.d system (derived
from NetBSD) and service(8) command to service script completion
definitions.
In addition to this, it'd be nice to see
Completion/Redhat/Command/_service moved to Completion/Unix/Command.
I think it'd be easy to also take care of NetBSD, but would just leave
it to its users since I'm just an oocasional user of the OS.
Regards,
--
Akinori MUSHA / http://akinori.org/
M Completion/Redhat/Command/_service
M Completion/Unix/Command/_init_d
M Completion/Unix/Type/_services
Index: Completion/Redhat/Command/_service
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Redhat/Command/_service,v
retrieving revision 1.3
diff -u -r1.3 _service
--- Completion/Redhat/Command/_service 23 May 2002 14:48:58 -0000 1.3
+++ Completion/Redhat/Command/_service 20 Apr 2010 05:53:34 -0000
@@ -10,13 +10,22 @@
zstyle ":completion:${ctx}" tag-order init
-_arguments -s \
- '(-d --debug)'{-d,--debug}'[turn debugging on]' \
- '(- :)'{-h,--help}'[print usage]' \
- '(- :)'{-v,--version}'[print version]' \
- '(-)'{-f,--full-restart}'[restart service]' \
- '(- :)'{-R,--full-restart-all}'[restart all services]' \
- '(- :)'{-s,--status-all}'[print status of all services]' \
- ':service name:_services' \
- '*::service argument: _init_d'
-
+if [[ $OSTYPE = freebsd* ]]; then
+ _arguments -s \
+ '(-)-e[show services that are enabled]' \
+ '(-)-l[list all scripts in /etc/rc.d and the local startup directory]' \
+ '(-)-r[show the results of boot time rcorder]' \
+ '(-)-v[verbose]' \
+ ':service name:_services' \
+ '*::service argument:_init_d'
+else
+ _arguments -s \
+ '(-d --debug)'{-d,--debug}'[turn debugging on]' \
+ '(- :)'{-h,--help}'[print usage]' \
+ '(- :)'{-v,--version}'[print version]' \
+ '(-)'{-f,--full-restart}'[restart service]' \
+ '(- :)'{-R,--full-restart-all}'[restart all services]' \
+ '(- :)'{-s,--status-all}'[print status of all services]' \
+ ':service name:_services' \
+ '*::service argument: _init_d'
+fi
Index: Completion/Unix/Command/_init_d
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_init_d,v
retrieving revision 1.9
diff -u -r1.9 _init_d
--- Completion/Unix/Command/_init_d 4 Oct 2009 18:20:00 -0000 1.9
+++ Completion/Unix/Command/_init_d 20 Apr 2010 05:53:34 -0000
@@ -1,39 +1,90 @@
#compdef -p */(init|rc[0-9S]#).d/*
-local magic cmds what script
+local cmds script
_compskip=all
-# This should probably be system specific...
+if [[ $OSTYPE = freebsd* ]]; then
+ (( $+functions[_init_d_fullpath] )) ||
+ _init_d_fullpath() {
+ local -a scriptpath
+ local name=$1 dir
+ # Known locations of init scripts
+ # C.f. Unix/Type/_services
+ scriptpath=(/etc/rc.d $(/bin/sh -c '. /etc/rc.subr; load_rc_config XXX; echo $local_startup' 2>/dev/null))
+
+ for dir in $scriptpath; do
+ if [[ -f $dir/$name ]]; then
+ echo $dir/$name
+ return 0
+ fi
+ done
+ return 1
+ }
+
+ (( $+functions[_init_d_get_cmds] )) ||
+ _init_d_get_cmds() {
+ local magic cmds cmd_prefix
+
+ [[ -x $script ]] || return 1
+ [[ $(read -u0 -k2 magic < $script && echo $magic) = '#!' ]] || return 0
+ [[ -f /etc/rc.subr ]] && [[ -x /sbin/rcorder ]] || return 0
+ grep -q '^ *\. */etc/rc\.subr *$' $script || return 0
+ cmds=(
+ start stop restart rcvar status poll
+ $(/bin/sh -c "set -- rcvar; . $script >/dev/null; echo \$extra_commands" 2>/dev/null)
+ )
+
+ for cmd_prefix in {,one,fast,force,quiet}; do
+ echo ${cmds/#/$cmd_prefix}
+ done
+
+ return 0
+ }
+else
+ (( $+functions[_init_d_fullpath] )) ||
+ _init_d_fullpath() {
+ local -a scriptpath
+ local name=$1 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/$name ]]; then
+ echo $dir/$name
+ return 0
+ fi
+ done
+ return 1
+ }
+
+ (( $+functions[_init_d_get_cmds] )) ||
+ _init_d_get_cmds() {
+ local what magic cmds
-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 <space>foo|bar) with the words in $what.
-# If the file starts with `#!' we hope that this is a shell script
-# and get lines looking like <space>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)'
-what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
-
-read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
+ 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 <space>foo).
-# Some people say this might match too many lines...
-#
-# cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} )
+ # This would be the pattern to use every line of the form <space>foo).
+ # Some people say this might match too many lines...
+ #
+ # cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} )
+
+ echo $cmds
+ return 0
+ }
+fi
+
+script=$words[1]
+[[ $script = */* ]] || script="$(_init_d_fullpath "$script")"
+
+cmds=( $(_init_d_get_cmds) ) || return
(( $#cmds )) || zstyle -a ":completion:${curcontext}:commands" commands cmds ||
cmds=(start stop)
Index: Completion/Unix/Type/_services
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_services,v
retrieving revision 1.5
diff -u -r1.5 _services
--- Completion/Unix/Type/_services 4 Oct 2009 18:20:00 -0000 1.5
+++ Completion/Unix/Type/_services 20 Apr 2010 05:53:34 -0000
@@ -3,7 +3,13 @@
local -a inits xinetds alls
local expl ret=1
-if chkconfig --list > /dev/null 2>&1; then
+if [[ $OSTYPE = freebsd* ]]; then
+ if [[ -x /usr/sbin/service ]]; then
+ alls=( $(service -l) ) && ret=0
+
+ _wanted services expl service compadd "$@" - $alls[@] && ret=0
+ fi
+elif chkconfig --list > /dev/null 2>&1; then
alls=( ${(f)"$(LANGUAGE=C LANG=C LC_ALL=C chkconfig --list)"} )
inits=( ${${${alls[1,(r)xinetd based*]}[1,-2]}/%[[:space:]]*/} )
xinetds=( ${${${${alls[(r)xinetd based*,-1]}[2,-1]}/#[[:space:]]#}/%:*} )
Attachment:
pgpY6gMOPI0nG.pgp
Description: PGP signature