summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Olexa <darkside@gentoo.org>2009-06-13 02:17:24 +0000
committerJeremy Olexa <darkside@gentoo.org>2009-06-13 02:17:24 +0000
commit1b484f39457b43388418feeb6e11efdceb50fee4 (patch)
treeb00ec0abc29c8112cba374317b77122bd99c143a
parentadd missing ebuild options to ebuild(1) completion, bug 270560 (diff)
downloadgentoo-bashcomp-1b484f39457b43388418feeb6e11efdceb50fee4.tar.gz
gentoo-bashcomp-1b484f39457b43388418feeb6e11efdceb50fee4.tar.bz2
gentoo-bashcomp-1b484f39457b43388418feeb6e11efdceb50fee4.zip
Add support for rc-service, patch by Finn Wilke <wilkefi@googlemail.com>, bug 227139gentoo-bashcomp-20090613
svn path=/trunk/; revision=91
-rw-r--r--gentoo105
1 files changed, 105 insertions, 0 deletions
diff --git a/gentoo b/gentoo
index 54ef40f..6289a58 100644
--- a/gentoo
+++ b/gentoo
@@ -1857,4 +1857,109 @@ _metagen() {
complete -F _metagen metagen
}
+have rc-service && {
+_rc_service() {
+ local cur prev numwords opts
+ local words i x filename
+ local action actionpos
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ numwords=${#COMP_WORDS[*]}
+
+ if [[ ${prev} == '>' || ${prev} == '<' ]] ; then
+ COMPREPLY=($(compgen -f -- ${cur}))
+ return 0
+ fi
+
+ # find action
+ for x in ${COMP_LINE} ; do
+ if [[ ${x} =~ --(list|exists|resolve) ]] || \
+ [[ ${x} =~ -(l|e|r) ]]
+ then
+ action=${x}
+ break
+ fi
+ done
+ if [[ -n ${action} ]]; then
+ for ((i = 0; i < ${numwords}; i++ )); do
+ if [[ ${COMP_WORDS[${i}]} == "${action}" ]]; then
+ actionpos=${i}
+ break
+ fi
+ done
+
+ for ((i = 1; i < ${numwords}; i++ )); do
+ if [[ ! ${COMP_WORDS[$i]} == -* ]]; then
+ break
+ fi
+ done
+ fi
+
+ if [[ ${COMP_CWORD} -eq 3 ]]; then
+ return 1
+ fi
+
+ # check if an option was typed
+ if [[ ${cur} == -* ]]; then
+ if [[ ${cur} == --* ]]; then
+ opts="--list --exists --resolve"
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ elif [[ ${cur} == -* ]]; then
+ opts="-l -e -r"
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ fi
+
+
+ # NOTE: This slows things down!
+ # (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>)
+ # This removes any options from the list of completions that have
+ # already been specified on the command line.
+ COMPREPLY=($(echo "${COMP_WORDS[@]}" | \
+ (while read -d ' ' i; do
+ [[ -z ${i} ]] && continue
+ # flatten array with spaces on either side,
+ # otherwise we cannot grep on word boundaries of
+ # first and last word
+ COMPREPLY=" ${COMPREPLY[@]} "
+ # remove word from list of completions
+ COMPREPLY=(${COMPREPLY/ ${i%% *} / })
+ done
+ echo ${COMPREPLY[@]})))
+
+ return 0
+ # if no option typed
+ else
+ if [[ ${COMP_CWORD} -eq 1 ]]; then # if first word typed
+ words="`rc-service -l | grep ^${cur}`" # complete for init scripts
+ COMPREPLY=($(for i in ${words} ; do \
+ [[ ${i} == ${cur}* ]] && echo ${i} ; \
+ done))
+ return 0
+ elif [[ ${COMP_CWORD} -eq 2 ]] && [[ ${prev} != -* ]]; then # if second word typed and we didn't type in a function
+ filename=`rc-service -r ${prev}`
+ opts=`cat ${filename} | grep "^\w*()" | sed "s/().*$//"` # Greps the functions included in the init script
+ if [[ "x${opts}" == "x" ]] ; then # if no options found loosen the grep algorhythm
+ opts=`cat ${filename} | grep "\w*()" | sed "s/().*$//"`
+ fi
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ fi
+ fi
+ if [[ ${action} == '--exists' ]] || [[ ${action} == '-e' ]] || \
+ [[ ${action} == '--resolve' ]] || [[ ${action} == '-r' ]]; then
+ words="`rc-service -l | grep ^${cur}`"
+ COMPREPLY=($(for i in ${words} ; do \
+ [[ ${i} == ${cur}* ]] && echo ${i} ; \
+ done))
+ return 0
+ fi
+
+return 0
+}
+complete -F _rc_service rc-service
+}
+
# vim: set ft=sh tw=80 sw=4 et :