add defaults autocompletion for OS X
authorTravis Swicegood <development@domain51.com>
Sun, 19 Feb 2012 03:52:10 +0000 (21:52 -0600)
committerTravis Swicegood <development@domain51.com>
Sun, 19 Feb 2012 03:52:10 +0000 (21:52 -0600)
completion/available/defaults.completion.bash [new file with mode: 0644]

diff --git a/completion/available/defaults.completion.bash b/completion/available/defaults.completion.bash
new file mode 100644 (file)
index 0000000..5a8d034
--- /dev/null
@@ -0,0 +1,175 @@
+# 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.