| # defaults |
| # Bash command line completion for defaults |
| # |
| # Created by Jonathon Mah on 2006-11-08. |
| # Copyright 2006 Playhaus. All rights reserved. |
| # |
| # Version 1.0 (2006-11-08) |
| |
| |
| _defaults_domains() |
| { |
| local cur |
| COMPREPLY=() |
| cur=${COMP_WORDS[COMP_CWORD]} |
| |
| local domains=$( defaults domains | sed -e 's/, /:/g' | tr : '\n' | sed -e 's/ /\\ /g' | grep -i "^$cur" ) |
| local IFS=$'\n' |
| COMPREPLY=( $domains ) |
| if [[ $( echo '-app' | grep "^$cur" ) ]]; then |
| COMPREPLY[${#COMPREPLY[@]}]="-app" |
| fi |
| |
| return 0 |
| } |
| |
| |
| _defaults() |
| { |
| local cur prev host_opts cmds cmd domain keys key_index |
| cur=${COMP_WORDS[COMP_CWORD]} |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| host_opts='-currentHost -host' |
| cmds='read read-type write rename delete domains find help' |
| |
| if [[ $COMP_CWORD -eq 1 ]]; then |
| COMPREPLY=( $( compgen -W "$host_opts $cmds" -- $cur ) ) |
| return 0 |
| elif [[ $COMP_CWORD -eq 2 ]]; then |
| if [[ "$prev" == "-currentHost" ]]; then |
| COMPREPLY=( $( compgen -W "$cmds" -- $cur ) ) |
| return 0 |
| elif [[ "$prev" == "-host" ]]; then |
| return 0 |
| _known_hosts -a |
| else |
| _defaults_domains |
| return 0 |
| fi |
| elif [[ $COMP_CWORD -eq 3 ]]; then |
| if [[ ${COMP_WORDS[1]} == "-host" ]]; then |
| _defaults_domains |
| return 0 |
| fi |
| fi |
| |
| # Both a domain and command have been specified |
| |
| if [[ ${COMP_WORDS[1]} == [${cmds// /|}] ]]; then |
| cmd=${COMP_WORDS[1]} |
| domain=${COMP_WORDS[2]} |
| key_index=3 |
| if [[ "$domain" == "-app" ]]; then |
| if [[ $COMP_CWORD -eq 3 ]]; then |
| # Completing application name. Can't help here, sorry |
| return 0 |
| fi |
| domain="-app ${COMP_WORDS[3]}" |
| key_index=4 |
| fi |
| elif [[ ${COMP_WORDS[2]} == "-currentHost" ]] && [[ ${COMP_WORDS[2]} == [${cmds// /|}] ]]; then |
| cmd=${COMP_WORDS[2]} |
| domain=${COMP_WORDS[3]} |
| key_index=4 |
| if [[ "$domain" == "-app" ]]; then |
| if [[ $COMP_CWORD -eq 4 ]]; then |
| # Completing application name. Can't help here, sorry |
| return 0 |
| fi |
| domain="-app ${COMP_WORDS[4]}" |
| key_index=5 |
| fi |
| elif [[ ${COMP_WORDS[3]} == "-host" ]] && [[ ${COMP_WORDS[3]} == [${cmds// /|}] ]]; then |
| cmd=${COMP_WORDS[3]} |
| domain=${COMP_WORDS[4]} |
| key_index=5 |
| if [[ "$domain" == "-app" ]]; then |
| if [[ $COMP_CWORD -eq 5 ]]; then |
| # Completing application name. Can't help here, sorry |
| return 0 |
| fi |
| domain="-app ${COMP_WORDS[5]}" |
| key_index=6 |
| fi |
| fi |
| |
| keys=$( defaults read $domain 2>/dev/null | sed -n -e '/^ [^}) ]/p' | sed -e 's/^ \([^" ]\{1,\}\) = .*$/\1/g' -e 's/^ "\([^"]\{1,\}\)" = .*$/\1/g' | sed -e 's/ /\\ /g' ) |
| |
| case $cmd in |
| read|read-type) |
| # Complete key |
| local IFS=$'\n' |
| COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) ) |
| ;; |
| write) |
| if [[ $key_index -eq $COMP_CWORD ]]; then |
| # Complete key |
| local IFS=$'\n' |
| COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) ) |
| elif [[ $((key_index+1)) -eq $COMP_CWORD ]]; then |
| # Complete value type |
| # Unfortunately ${COMP_WORDS[key_index]} fails on keys with spaces |
| local value_types='-string -data -integer -float -boolean -date -array -array-add -dict -dict-add' |
| local cur_type=$( defaults read-type $domain ${COMP_WORDS[key_index]} 2>/dev/null | sed -e 's/^Type is \(.*\)/-\1/' -e's/dictionary/dict/' | grep "^$cur" ) |
| if [[ $cur_type ]]; then |
| COMPREPLY=( $cur_type ) |
| else |
| COMPREPLY=( $( compgen -W "$value_types" -- $cur ) ) |
| fi |
| elif [[ $((key_index+2)) -eq $COMP_CWORD ]]; then |
| # Complete value |
| # Unfortunately ${COMP_WORDS[key_index]} fails on keys with spaces |
| COMPREPLY=( $( defaults read $domain ${COMP_WORDS[key_index]} 2>/dev/null | grep -i "^${cur//\\/\\\\}" ) ) |
| fi |
| ;; |
| rename) |
| if [[ $key_index -eq $COMP_CWORD ]] || |
| [[ $((key_index+1)) -eq $COMP_CWORD ]]; then |
| # Complete source and destination keys |
| local IFS=$'\n' |
| COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) ) |
| fi |
| ;; |
| delete) |
| if [[ $key_index -eq $COMP_CWORD ]]; then |
| # Complete key |
| local IFS=$'\n' |
| COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) ) |
| fi |
| ;; |
| esac |
| |
| return 0 |
| } |
| |
| complete -F _defaults -o default defaults |
| |
| |
| # This file is licensed under the BSD license, as follows: |
| # |
| # Copyright (c) 2006, Playhaus |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are met: |
| # |
| # * Redistributions of source code must retain the above copyright notice, this |
| # list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above copyright notice, |
| # this list of conditions and the following disclaimer in the documentation |
| # and/or other materials provided with the distribution. |
| # * Neither the name of the Playhaus nor the names of its contributors may be |
| # used to endorse or promote products derived from this software without |
| # specific prior written permission. |
| # |
| # This software is provided by the copyright holders and contributors "as is" |
| # and any express or implied warranties, including, but not limited to, the |
| # implied warranties of merchantability and fitness for a particular purpose are |
| # disclaimed. In no event shall the copyright owner or contributors be liable |
| # for any direct, indirect, incidental, special, exemplary, or consequential |
| # damages (including, but not limited to, procurement of substitute goods or |
| # services; loss of use, data, or profits; or business interruption) however |
| # caused and on any theory of liability, whether in contract, strict liability, |
| # or tort (including negligence or otherwise) arising in any way out of the use |
| # of this software, even if advised of the possibility of such damage. |