diff --git a/bash_it.sh b/bash_it.sh
old mode 100644
new mode 100755
index 8564c88..cd97ab3
--- a/bash_it.sh
+++ b/bash_it.sh
@@ -21,6 +21,9 @@
     unset $BASH_THEME;
 fi
 
+# Load composure first, so we support function metadata
+source "${BASH_IT}/lib/composure.sh"
+
 # Load colors first so they can be use in base theme
 source "${BASH_IT}/themes/colors.theme.bash"
 source "${BASH_IT}/themes/base.theme.bash"
diff --git a/lib/composure.sh b/lib/composure.sh
new file mode 100755
index 0000000..b4b740b
--- /dev/null
+++ b/lib/composure.sh
@@ -0,0 +1,213 @@
+#!/bin/bash
+# Composure - don't fear the UNIX chainsaw...
+# by erichs, 2012
+
+# these are a set of light-hearted shell functions that aim to make
+# programming the shell easier and more intuitive
+
+# latest source available at http://git.io/composure
+
+source_composure ()
+{
+    if [ -z "$EDITOR" ]
+    then
+      export EDITOR=vi
+    fi
+
+    if $(tty -s)    # is this a TTY?
+    then
+      bind '"\C-j": edit-and-execute-command'
+    fi
+
+    cite ()
+    {
+        about () { :; }
+        about creates a new meta keyword for use in your functions
+        local keyword=$1
+        for keyword in $*; do
+            eval "function $keyword { :; }"
+        done
+    }
+
+    cite about param example
+
+    draft ()
+    {
+      about wraps last command into a new function
+      param 1: name to give function
+      example $ ls
+      example $ draft list
+      example $ list
+      local name=$1
+      eval 'function ' $name ' { ' $(fc -ln -1) '; }'
+    }
+
+    write ()
+    {
+      about prints function declaration to stdout
+      param name of function or functions, separated by spaces
+      example $ write myfunction
+      example $ write func1 func2 func3 > ~/funcs.sh
+      local func
+      for func in $*
+      do
+          # trim trailing semicolons generated by declare -f
+          declare -f $func | sed  "s/^\(.*\);$/\1/"
+          echo
+      done
+    }
+
+    revise ()
+    {
+        about loads function into editor for revision
+        param name of function or functions, separated by spaces
+        example $ revise myfunction
+        example $ revise func1 func2 func3
+        local temp=$(mktemp /tmp/revise.XXXX)
+        write $* > $temp
+        $EDITOR $temp
+        eval "$(cat $temp)"
+        rm $temp
+    }
+
+    metafor ()
+    {
+        about prints function metadata associated with keyword
+        param 1: function name
+        param 2: meta keyword
+        example $ metafor reference example
+        local func=$1 keyword=$2
+        write $func | sed -n "s/^ *$keyword \([^([].*\)$/\1/p"
+    }
+
+    reference ()
+    {
+        about displays help summary for all functions, or help for specific function
+        param 1: optional, function name
+        example $ reference
+        example $ reference metafor
+
+        printline ()
+        {
+            local metadata=$1 lhs=${2:- }
+
+            if [[ -z "$metadata" ]]
+            then
+                return
+            fi
+
+            OLD=$IFS; IFS=$'\n'
+            local line
+            for line in $metadata
+            do
+                printf "%-20s%s\n" $lhs $line
+            done
+            IFS=$OLD
+        }
+
+        help ()
+        {
+            local func=$1
+
+            local about="$(metafor $func about)"
+            printline "$about" $func
+
+            local params="$(metafor $func param)"
+            if [[ -n "$params" ]]
+            then
+                echo "parameters:"
+                printline "$params"
+            fi
+
+            local examples="$(metafor $func example)"
+            if [[ -n "$examples" ]]
+            then
+                echo "examples:"
+                printline "$examples"
+            fi
+
+            unset printline
+        }
+
+        if [[ -n "$1" ]]
+        then
+            help $1
+        else
+            for func in $(compgen -A function); do
+                local about="$(metafor $func about)"
+                printline "$about" $func
+            done
+        fi
+
+        unset help printline
+    }
+
+}
+
+install_composure ()
+{
+    echo 'stay calm. installing composure elements...'
+
+    # find our absolute PATH
+    SOURCE="${BASH_SOURCE[0]}"
+    while [ -h "$SOURCE" ]
+    do
+        SOURCE="$(readlink "$SOURCE")"
+    done
+    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+
+    # vim: automatically chmod +x scripts with #! lines
+    done_previously () { [ ! -z "$(grep BufWritePost | grep bin | grep chmod)" ]; }
+
+    if [ -f ~/.vimrc ] && ! $(<~/.vimrc done_previously)
+    then
+      echo 'vimrc: adding automatic chmod+x for files with shebang (#!) lines...'
+      echo 'au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif' >> ~/.vimrc
+    fi
+
+    # source this file in your startup: .bashrc, or .bash_profile
+    local done=0
+    done_previously () { [ ! -z "$(grep source | grep $DIR | grep composure)" ]; }
+
+    [ -f ~/.bashrc ] && $(<~/.bashrc done_previously) && done=1
+    ! (($done)) && [ -f ~/.bash_profile ] && $(<~/.bash_profile done_previously) && done=1
+
+    if ! (($done))
+    then
+      echo 'sourcing composure from .bashrc...'
+      echo "source $DIR/$(basename $0)" >> ~/.bashrc
+    fi
+
+    echo 'composure installed.'
+}
+
+if [[ "$BASH_SOURCE" == "$0" ]]
+then
+  install_composure
+else
+  source_composure
+  unset install_composure source_composure
+fi
+
+: <<EOF
+License: The MIT License
+
+Copyright © 2012 Erich Smith
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+EOF
diff --git a/plugins/available/base.plugin.bash b/plugins/available/base.plugin.bash
old mode 100644
new mode 100755
index 3edd8ad..0447f33
--- a/plugins/available/base.plugin.bash
+++ b/plugins/available/base.plugin.bash
@@ -2,84 +2,125 @@
 
 # For generic functions.
 
-function ips {
-  ifconfig | grep "inet " | awk '{ print $2 }'
+ips ()
+{
+    about display all ip addresses for this host
+    ifconfig | grep "inet " | awk '{ print $2 }'
 }
 
-function down4me() {
-  curl -s "http://www.downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g'
+down4me ()
+{
+    about checks whether a website is down for you, or everybody
+    param 1: website url
+    example $ down4me http://www.google.com
+    curl -s "http://www.downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g'
 }
 
-function myip {
-  res=$(curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+')
-  echo -e "Your public IP is: ${echo_bold_green} $res ${echo_normal}"
-}
-
-pass() {
-  which gshuf &> /dev/null
-  if [ $? -eq 1 ]
-  then
-    echo "Error: shuf isn't installed!"
-    return 1
-  fi
-
-  pass=$(shuf -n4 /usr/share/dict/words | tr '\n' ' ')
-  echo "With spaces (easier to memorize): $pass"
-  echo "Without (use this as the pass): $(echo $pass | tr -d ' ')"
-}
-
-# Function for previewing markdown files in the browser
-
-function pmdown() {
-  if command -v markdown &>/dev/null
-  then
-    markdown $1 | browser
-  else
-    echo "You don't have a markdown command installed!"
-  fi
-}
-
-# Make a directory and immediately 'cd' into it
-
-function mkcd() {
-  mkdir -p "$*"
-  cd "$*"
-}
-
-# Search through directory contents with grep
-
-function lsgrep(){
-  ls | grep "$*"
-}
-
-# View man documentation in Preview
-pman () {
-   man -t "${1}" | open -f -a $PREVIEW
+myip ()
+{
+    about displays your ip address, as seen by the Internet
+    res=$(curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+')
+    echo -e "Your public IP is: ${echo_bold_green} $res ${echo_normal}"
 }
 
 
-pcurl() {
-  curl "${1}" | open -f -a $PREVIEW
+pickfrom ()
+{
+    about picks random line from file
+    param 1: filename
+    example $ pickfrom /usr/share/dict/words
+    local file=$1
+    [ -z "$file" ] && reference $FUNCNAME && return
+    length=$(cat $file | wc -l)
+    n=$(expr $RANDOM \* $length \/ 32768 + 1)
+    head -n $n $file | tail -1
 }
 
-pri() {
-  ri -T "${1}" | open -f -a $PREVIEW
+pass ()
+{
+    about generates random password from dictionary words
+    param optional integer length
+    param if unset, defaults to 4
+    example $ pass
+    example $ pass 6
+    local i pass length=${1:-4}
+    pass=$(echo $(for i in $(eval echo "{1..$length}"); do pickfrom /usr/share/dict/words; done))
+    echo "With spaces (easier to memorize): $pass"
+    echo "Without (use this as the pass): $(echo $pass | tr -d ' ')"
 }
 
-quiet() {
+pmdown ()
+{
+    about preview markdown file in a browser
+    param 1: markdown file
+    example $ pmdown README.md
+    if command -v markdown &>/dev/null
+    then
+      markdown $1 | browser
+    else
+      echo "You don't have a markdown command installed!"
+    fi
+}
+
+mkcd ()
+{
+    about make a directory and cd into it
+    param path to create
+    example $ mkcd foo
+    example $ mkcd /tmp/img/photos/large
+    mkdir -p "$*"
+    cd "$*"
+}
+
+lsgrep ()
+{
+    about search through directory contents with grep
+    ls | grep "$*"
+}
+
+
+pman ()
+{
+    about view man documentation in Preview
+    param 1: man page to view
+    example $ pman bash
+    man -t "${1}" | open -f -a $PREVIEW
+}
+
+
+pcurl ()
+{
+    about download file and Preview it
+    param 1: download URL
+    example $ pcurl http://www.irs.gov/pub/irs-pdf/fw4.pdf
+    curl "${1}" | open -f -a $PREVIEW
+}
+
+pri ()
+{
+    about display information about Ruby classes, modules, or methods, in Preview
+    param 1: Ruby method, module, or class
+    example $ pri Array
+    ri -T "${1}" | open -f -a $PREVIEW
+}
+
+quiet ()
+{
 	$* &> /dev/null &
 }
 
-banish-cookies() {
+banish-cookies ()
+{
+    about redirect .adobe and .macromedia files to /dev/null
 	rm -r ~/.macromedia ~/.adobe
 	ln -s /dev/null ~/.adobe
 	ln -s /dev/null ~/.macromedia
 }
 
-# disk usage per directory
-# in Mac OS X and Linux
 usage ()
 {
+    about disk usage per directory, in Mac OS X and Linux
+    param 1: directory name
     if [ $(uname) = "Darwin" ]; then
         if [ -n $1 ]; then
             du -hd $1
@@ -96,25 +137,31 @@
     fi
 }
 
-# One thing todo
-function t() {
-	 if [[ "$*" == "" ]] ; then
-		 cat ~/.t
-	 else
-		 echo "$*" > ~/.t
-	 fi
+t ()
+{
+    about one thing todo
+    param if not set, display todo item
+    param 1: todo text
+	if [[ "$*" == "" ]] ; then
+	    cat ~/.t
+	else
+	    echo "$*" > ~/.t
+	fi
 }
 
-# Checks for existence of a command
-command_exists () {
+command_exists ()
+{
+    about checks for existence of a command
+    param 1: command to check
+    example $ command_exists ls && echo 'exists'
     type "$1" &> /dev/null ;
 }
 
-# List all plugins and functions defined by bash-it
-function plugins-help() {
-    
+plugins-help ()
+{
+    about list all plugins and functions defined by bash-it
     echo "bash-it Plugins Help-Message"
-    echo 
+    echo
 
     set | grep "()" \
     | sed -e "/^_/d" | grep -v "BASH_ARGC=()" \
@@ -128,10 +175,12 @@
     | grep -v "COMPREPLY=()" | sed -e "s/()//"
 }
 
-# back up file with timestamp
 # useful for administrators and configs
-buf () {
-    filename=$1
-    filetime=$(date +%Y%m%d_%H%M%S)
+buf ()
+{
+    about back up file with timestamp
+    param filename
+    local filename=$1
+    local filetime=$(date +%Y%m%d_%H%M%S)
     cp ${filename} ${filename}_${filetime}
 }
diff --git a/themes/base.theme.bash b/themes/base.theme.bash
index fe112ec..15bd4aa 100644
--- a/themes/base.theme.bash
+++ b/themes/base.theme.bash
@@ -121,7 +121,7 @@
 
 function rbenv_version_prompt {
   if which rbenv &> /dev/null; then
-    rbenv=$(rbenv global) || return
+    rbenv=$(rbenv version-name) || return
     echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX"
   fi
 }
diff --git a/themes/zork/zork.theme.bash b/themes/zork/zork.theme.bash
index f541c0d..c71f134 100644
--- a/themes/zork/zork.theme.bash
+++ b/themes/zork/zork.theme.bash
@@ -53,6 +53,8 @@
             ;;
     "pandora") my_ps_host="${red}\h${normal}";
             ;;
+    * ) my_ps_host="${green}\h${normal}";
+            ;;
     esac
 
     my_ps_user="\[\033[01;32m\]\u\[\033[00m\]";
