Merge remote-tracking branch 'berenm/master'
diff --git a/completion/available/fabric-completion.bash b/completion/available/fabric-completion.bash
new file mode 100644
index 0000000..a4aa90f
--- /dev/null
+++ b/completion/available/fabric-completion.bash
@@ -0,0 +1,133 @@
+#!/bin/bash
+#
+# Bash completion support for Fabric (http://fabfile.org/)
+#
+#
+# Copyright (C) 2011 by Konstantin Bakulin
+#
+# 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.
+#
+# Thanks to:
+# - Adam Vandenberg,
+#   https://github.com/adamv/dotfiles/blob/master/completion_scripts/fab_completion.bash
+#
+# - Enrico Batista da Luz,
+#   https://github.com/ricobl/dotfiles/blob/master/bin/fab_bash_completion
+#
+
+
+# Use cache files for fab tasks or not.
+# If set to "false" command "fab --shortlist" will be executed every time.
+export FAB_COMPLETION_CACHE_TASKS=true
+
+# File name where tasks cache will be stored (in current dir).
+export FAB_COMPLETION_CACHED_TASKS_FILENAME=".fab_tasks~"
+
+
+# Set command to get time of last file modification as seconds since Epoch
+case `uname` in
+    Darwin|FreeBSD)
+        __FAB_COMPLETION_MTIME_COMMAND="stat -f '%m'"
+        ;;
+    *)
+        __FAB_COMPLETION_MTIME_COMMAND="stat -c '%Y'"
+        ;;
+esac
+
+
+#
+# Get time of last fab cache file modification as seconds since Epoch
+#
+function __fab_chache_mtime() {
+    ${__FAB_COMPLETION_MTIME_COMMAND} \
+        $FAB_COMPLETION_CACHED_TASKS_FILENAME | xargs -n 1 expr
+}
+
+
+#
+# Get time of last fabfile file/module modification as seconds since Epoch
+#
+function __fab_fabfile_mtime() {
+    local f="fabfile"
+    if [[ -e "$f.py" ]]; then
+        ${__FAB_COMPLETION_MTIME_COMMAND} "$f.py" | xargs -n 1 expr
+    else
+        # Suppose that it's a fabfile dir
+        find $f/*.py -exec ${__FAB_COMPLETION_MTIME_COMMAND} {} + \
+            | xargs -n 1 expr | sort -n -r | head -1
+    fi
+}
+
+
+#
+# Completion for "fab" command
+#
+function __fab_completion() {
+    # Return if "fab" command doesn't exists
+    [[ -e `which fab 2> /dev/null` ]] || return 0
+
+    # Variables to hold the current word and possible matches
+    local cur="${COMP_WORDS[COMP_CWORD]}"
+    local opts=()
+
+    # Generate possible matches and store them in variable "opts"
+    case "${cur}" in
+        -*)
+            if [[ -z "${__FAB_COMPLETION_LONG_OPT}" ]]; then
+                export __FAB_COMPLETION_LONG_OPT=$(
+                    fab --help | egrep -o "\-\-[A-Za-z_\-]+\=?" | sort -u)
+            fi
+            opts="${__FAB_COMPLETION_LONG_OPT}"
+            ;;
+
+        # Completion for short options is not nessary.
+        # It's left here just for history.
+        # -*)
+        #     if [[ -z "${__FAB_COMPLETION_SHORT_OPT}" ]]; then
+        #         export __FAB_COMPLETION_SHORT_OPT=$(
+        #             fab --help | egrep -o "^ +\-[A-Za-z_\]" | sort -u)
+        #     fi
+        #     opts="${__FAB_COMPLETION_SHORT_OPT}"
+        #     ;;
+
+        *)
+            # If "fabfile.py" or "fabfile" dir with "__init__.py" file exists
+            local f="fabfile"
+            if [[ -e "$f.py" || (-d "$f" && -e "$f/__init__.py") ]]; then
+                # Build a list of the available tasks
+                if $FAB_COMPLETION_CACHE_TASKS; then
+                    # If use cache
+                    if [[ ! -s ${FAB_COMPLETION_CACHED_TASKS_FILENAME} ||
+                          $(__fab_fabfile_mtime) -gt $(__fab_chache_mtime) ]]; then
+                        fab --shortlist > ${FAB_COMPLETION_CACHED_TASKS_FILENAME} \
+                            2> /dev/null
+                    fi
+                    opts=$(cat ${FAB_COMPLETION_CACHED_TASKS_FILENAME})
+                else
+                    # Without cache
+                    opts=$(fab --shortlist 2> /dev/null)
+                fi
+            fi
+            ;;
+    esac
+
+    # Set possible completions
+    COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
+}
+complete -o default -o nospace -F __fab_completion fab
diff --git a/completion/available/tmux.completion.bash b/completion/available/tmux.completion.bash
new file mode 100644
index 0000000..4fd0e0c
--- /dev/null
+++ b/completion/available/tmux.completion.bash
@@ -0,0 +1,163 @@
+#!/bin/bash
+
+# tmux completion
+# See: http://www.debian-administration.org/articles/317 for how to write more.
+# Usage: Put "source bash_completion_tmux.sh" into your .bashrc
+# Based upon the example at http://paste-it.appspot.com/Pj4mLycDE
+
+function _tmux_complete_client() {
+    local IFS=$'\n'
+    local cur="${1}"
+    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$(tmux -q list-clients | cut -f 1 -d ':')" -- "${cur}") )
+}
+function _tmux_complete_session() {
+    local IFS=$'\n'
+    local cur="${1}"
+    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$(tmux -q list-sessions | cut -f 1 -d ':')" -- "${cur}") )
+}
+function _tmux_complete_window() {
+    local IFS=$'\n'
+    local cur="${1}"
+    local session_name="$(echo "${cur}" | sed 's/\\//g' | cut -d ':' -f 1)"
+    local sessions
+    
+    sessions="$(tmux -q list-sessions | sed -re 's/([^:]+:).*$/\1/')"
+    if [[ -n "${session_name}" ]]; then
+        sessions="${sessions}
+$(tmux -q list-windows -t "${session_name}" | sed -re 's/^([^:]+):.*$/'"${session_name}"':\1/')"
+    fi
+    cur="$(echo "${cur}" | sed -e 's/:/\\\\:/')"
+    sessions="$(echo "${sessions}" | sed -e 's/:/\\\\:/')"
+    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${sessions}" -- "${cur}") )
+}
+
+_tmux() {
+    local cur prev
+    local i cmd cmd_index option option_index
+    local opts=""
+    COMPREPLY=()
+    cur="${COMP_WORDS[COMP_CWORD]}"
+    prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+    if [ ${prev} == -f ]; then
+        _filedir
+    else
+    # Search for the command
+    local skip_next=0
+    for ((i=1; $i<=$COMP_CWORD; i++)); do
+        if [[ ${skip_next} -eq 1 ]]; then
+            #echo "Skipping"
+            skip_next=0;
+        elif [[ ${COMP_WORDS[i]} != -* ]]; then
+            cmd="${COMP_WORDS[i]}"
+            cmd_index=${i}
+            break
+        elif [[ ${COMP_WORDS[i]} == -f ]]; then
+            skip_next=1
+        fi
+    done
+
+    # Search for the last option command
+    skip_next=0
+    for ((i=1; $i<=$COMP_CWORD; i++)); do
+        if [[ ${skip_next} -eq 1 ]]; then
+            #echo "Skipping"
+            skip_next=0;
+        elif [[ ${COMP_WORDS[i]} == -* ]]; then
+            option="${COMP_WORDS[i]}"
+            option_index=${i}
+            if [[ ${COMP_WORDS[i]} == -- ]]; then
+                break;
+            fi
+        elif [[ ${COMP_WORDS[i]} == -f ]]; then
+            skip_next=1
+        fi
+    done
+
+    if [[ $COMP_CWORD -le $cmd_index ]]; then
+        # The user has not specified a command yet
+        local all_commands="$(tmux -q list-commands | cut -f 1 -d ' ')"
+        COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${all_commands}" -- "${cur}") )
+    else        
+        case ${cmd} in
+            attach-session|attach)
+            case "$prev" in
+                -t) _tmux_complete_session "${cur}" ;;
+                *) options="-t -d" ;;
+            esac ;;
+            detach-client|detach)
+            case "$prev" in
+                -t) _tmux_complete_client "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            lock-client|lockc)
+            case "$prev" in
+                -t) _tmux_complete_client "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            lock-session|locks)
+            case "$prev" in
+                -t) _tmux_complete_session "${cur}" ;;
+                *) options="-t -d" ;;
+            esac ;;
+            new-session|new)
+            case "$prev" in
+                -t) _tmux_complete_session "${cur}" ;;
+                -[n|d|s]) options="-d -n -s -t --" ;;
+                *) 
+                if [[ ${COMP_WORDS[option_index]} == -- ]]; then
+                    _command_offset ${option_index}
+                else
+                    options="-d -n -s -t --"
+                fi
+                ;;
+            esac
+            ;;
+            refresh-client|refresh)
+            case "$prev" in
+                -t) _tmux_complete_client "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            rename-session|rename)
+            case "$prev" in
+                -t) _tmux_complete_session "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            source-file|source) _filedir ;;
+            has-session|has|kill-session)
+            case "$prev" in
+                -t) _tmux_complete_session "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            suspend-client|suspendc)
+            case "$prev" in
+                -t) _tmux_complete_client "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+            switch-client|switchc)
+            case "$prev" in
+                -c) _tmux_complete_client "${cur}" ;;
+                -t) _tmux_complete_session "${cur}" ;;
+                *) options="-l -n -p -c -t" ;;
+            esac ;;
+            
+            send-keys|send)
+            case "$option" in
+                -t) _tmux_complete_window "${cur}" ;;
+                *) options="-t" ;;
+            esac ;;
+          esac # case ${cmd}
+        fi # command specified
+      fi # not -f 
+            
+      if [[ -n "${options}" ]]; then
+          COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${options}" -- "${cur}") )
+      fi
+            
+      return 0
+
+}
+complete -F _tmux tmux
+
+# END tmux completion
+
diff --git a/plugins/available/z_autoenv.plugins.bash b/plugins/available/z_autoenv.plugins.bash
new file mode 100644
index 0000000..04efa85
--- /dev/null
+++ b/plugins/available/z_autoenv.plugins.bash
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+if [[ -n "${ZSH_VERSION}" ]]
+then __array_offset=0
+else __array_offset=1
+fi
+
+autoenv_init()
+{
+  typeset target home _file
+  typeset -a _files
+  target=$1
+  home="$(dirname $HOME)"
+
+  _files=( $(
+    while [[ "$PWD" != "/" && "$PWD" != "$home" ]]
+    do
+      _file="$PWD/.env"
+      if [[ -e "${_file}" ]]
+      then echo "${_file}"
+      fi
+      builtin cd ..
+    done
+  ) )
+
+  _file=${#_files[@]}
+  while (( _file > 0 ))
+  do
+    source "${_files[_file-__array_offset]}"
+    : $(( _file -= 1 ))
+  done
+}
+
+cd()
+{
+  if builtin cd "$@"
+  then
+    autoenv_init
+    return 0
+  else
+    echo "else?"
+    return $?
+  fi
+}