From 6b3106ed584ca3b79e5a68eb91df383502538eb6 Mon Sep 17 00:00:00 2001 From: "Deavon M. McCaffery" Date: Wed, 24 Jun 2015 20:12:35 -0700 Subject: [PATCH] chore: first iteration of bash prompt for *nix --- install | 12 + src/bashrc | 83 + src/scripts/add-bookmark.sh | 19 + src/scripts/bookmarks.sh | 1 + src/scripts/clear-screen.sh | 3 + src/scripts/dotnet.sh | 38 + src/scripts/flush-dns.sh | 8 + src/scripts/git-completion.sh | 2741 ++++++++++++++++++++++++++ src/scripts/git-prompt.sh | 528 +++++ src/scripts/hide-all.sh | 5 + src/scripts/launch-editors.sh | 27 + src/scripts/list-directory.sh | 15 + src/scripts/play-login.sh | 9 + src/scripts/remove-bookmark.sh | 34 + src/scripts/remove-directory.sh | 3 + src/scripts/set-prompt.sh | 31 + src/scripts/show-all.sh | 4 + src/scripts/show-boomarks.sh | 11 + src/scripts/show-colors.sh | 11 + src/scripts/show-history.sh | 7 + src/scripts/themes.sh | 4 + src/sounds/login.mp3 | Bin 0 -> 41673 bytes src/themes/terminal/Monokai.terminal | 245 +++ template | 3 + 24 files changed, 3842 insertions(+) create mode 100755 install create mode 100755 src/bashrc create mode 100644 src/scripts/add-bookmark.sh create mode 100644 src/scripts/bookmarks.sh create mode 100644 src/scripts/clear-screen.sh create mode 100644 src/scripts/dotnet.sh create mode 100644 src/scripts/flush-dns.sh create mode 100644 src/scripts/git-completion.sh create mode 100644 src/scripts/git-prompt.sh create mode 100644 src/scripts/hide-all.sh create mode 100644 src/scripts/launch-editors.sh create mode 100644 src/scripts/list-directory.sh create mode 100644 src/scripts/play-login.sh create mode 100644 src/scripts/remove-bookmark.sh create mode 100644 src/scripts/remove-directory.sh create mode 100644 src/scripts/set-prompt.sh create mode 100644 src/scripts/show-all.sh create mode 100644 src/scripts/show-boomarks.sh create mode 100644 src/scripts/show-colors.sh create mode 100644 src/scripts/show-history.sh create mode 100644 src/scripts/themes.sh create mode 100644 src/sounds/login.mp3 create mode 100644 src/themes/terminal/Monokai.terminal create mode 100644 template diff --git a/install b/install new file mode 100755 index 0000000..1728aa4 --- /dev/null +++ b/install @@ -0,0 +1,12 @@ +rm -rRf backup +mkdir -p backup/ssh + +if ! test -f ~/.ssh; then + mkdir -p ~/.ssh +fi + +cp ~/.bash_profile backup/bash_profile +cp -R ~/.ssh/* backup/ssh + +cp -Rf src/* ~/.ssh +cat template > ~/.bash_profile diff --git a/src/bashrc b/src/bashrc new file mode 100755 index 0000000..76a3b7a --- /dev/null +++ b/src/bashrc @@ -0,0 +1,83 @@ +# set globals for colors +export CLR_CLEAR='\033[0m' # DEFAULT COLOR + +export CLR_BLACK='\033[0;30m' # ANSI BLACK (GRAY) +export CLR_RED='\033[0;31m' # ANSI RED +export CLR_GREEN='\033[0;32m' # ANSI GREEN +export CLR_YELLOW='\033[0;33m' # ANSI YELLOW +export CLR_BLUE='\033[0;34m' # ANSI BLUE +export CLR_MAGENTA='\033[0;35m' # ANSI MAGENTA (PURPLE) +export CLR_CYAN='\033[0;36m' # ANSI CYAN +export CLR_WHITE='\033[0;37m' # ANSI WHITE + +export CLR_BRIGHT_BLACK='\033[1;30m' # BRIGHT BLACK (GRAY) +export CLR_BRIGHT_RED='\033[1;31m' # BRIGHT RED +export CLR_BRIGHT_GREEN='\033[1;32m' # BRIGHT GREEN +export CLR_BRIGHT_YELLOW='\033[1;33m' # BRIGHT YELLOW +export CLR_BRIGHT_BLUE='\033[1;34m' # BRIGHT BLUE +export CLR_BRIGHT_MAGENTA='\033[1;35m' # BRIGHT MAGENTA (PURPLE) +export CLR_BRIGHT_CYAN='\033[1;36m' # BRIGHT CYAN +export CLR_BRIGHT_WHITE='\033[1;37m' # BRIGHT WHITE + +export CLR_ROOT_PROMPT=$CLR_RED # COLOR OF THE PROMPT FOR ROOT +export CLR_STAFF_PROMPT=$CLR_BRIGHT_RED # COLOR OF THE PROMPT FOR STAFF +export CLR_USER_PROMPT=$CLR_BRIGHT_BLUE # COLOR OF THE PROMPT FOR USERS + +# enable colors for various commands +export TERM=xterm-256color +export GREP_OPTIONS='--color=auto' +export GREP_COLOR='1;32' +export CLICOLOR=1 + +# other system settings +export EDITOR='nano' +export HISTCONTROL=ignoredubs +export SVN_EDITOR='${EDITOR}' + +# system binds for bash completion +bind "set completion-ignore-case on" # ignore strict case sensitivity +bind "set bell-style none" # turn off audible alerts +bind "set show-all-if-ambiguous on" # show completion with double tap + +# turn on advanced completion +if [ -f /etc/bash_completion ]; then + ./etc/bash_completion +fi + +# source scripts +for script in ~/.ssh/scripts/*.sh; do + source $script +done + +# aliases +# -- prompt for overwrites +alias cp='cp -i' +alias mv='mv -i' +alias rm='rm -i' + +# -- DOS-style shortcuts +alias cd..='cd ..' +alias ..='cd ..' +alias ...='cd .. ; ..' + +# -- listing shortcuts +alias ls='ls -G' + +# -- sudo alias (allow other alias extensions to work when sudo-ing) +alias sudo='sudo ' + +# -- special effects +alias colors="set | egrep 'CLR_w*'" +alias myprofile="history | awk '{print \$2}' | awk 'BEGIN{FS=\"|\"}{print \$1}' | sort | uniq -c | sort -n | tail -n 20 | sort -nr" + +alias flushdns='dscacheutil -flushcache; sudo killall -HUP mDNSResponder' + +# shell options +shopt -s checkwinsize # check window size on script exit +shopt -s cdable_vars # enable change directory to a variable value + +# aliases +PATH=$PATH:~/.ssh/aliases + +# play login sound +tlogi 1>&- 2>&- diff --git a/src/scripts/add-bookmark.sh b/src/scripts/add-bookmark.sh new file mode 100644 index 0000000..cb99ef9 --- /dev/null +++ b/src/scripts/add-bookmark.sh @@ -0,0 +1,19 @@ +function add-bookmark() { + # make sure that a bookmark was specified. + if [ -z $1 ]; then + echo USAGE: add-bookmark NAME + echo ' NAME : a title for your bookmark' + else + # make sure we remove any existing bookmark before defining another one. + remove-bookmark $1 silent + local b="$1"=\"`pwd`\" + + echo Adding bookmark: $b + echo $b >> ~/.ssh/scripts/bookmarks.sh + source ~/.ssh/scripts/bookmarks.sh + fi +} + +function mk-bm() { + add-bookmark $@ +} diff --git a/src/scripts/bookmarks.sh b/src/scripts/bookmarks.sh new file mode 100644 index 0000000..71d1dad --- /dev/null +++ b/src/scripts/bookmarks.sh @@ -0,0 +1 @@ +condo="/Volumes/Storage/Users/dmccaffery/Repos/condo" diff --git a/src/scripts/clear-screen.sh b/src/scripts/clear-screen.sh new file mode 100644 index 0000000..45effd0 --- /dev/null +++ b/src/scripts/clear-screen.sh @@ -0,0 +1,3 @@ +function cls() { + clear +} \ No newline at end of file diff --git a/src/scripts/dotnet.sh b/src/scripts/dotnet.sh new file mode 100644 index 0000000..d43ef2e --- /dev/null +++ b/src/scripts/dotnet.sh @@ -0,0 +1,38 @@ +function install-dnvm() { + local dnvmpath=~/.dnx/dnvm + local dnvmuri="https://raw.githubusercontent.com/aspnet/Home/dev/dnvm.sh" + local dnvmsh=$dnvmpath/dnvm.sh + + # determine if the dnvm folder exists + if test ! -d "$dnvmpath"; then + # create the dnvm folder + mkdir -p "$dnvmpath" + fi + + # determine if the dnvm script file does not exist + if test ! -f "$dnvmsh"; then + # attempt to download it from curl + local result=$(curl -L -D - "$dnvmuri" -o "$dnvmsh" -# | grep "^HTTP/1.1" | head -n 1 | sed "s/HTTP.1.1 \([0-9]*\).*/\1/") + + # source it if it was successfully retrieved + [[ $result == "200" ]] && chmod ugo+x "$dnvmsh" + fi +} + +# determine if dnvm is avialable +if ! type dnvm >/dev/null 2>&1; then + # install dnvm + install-dnvm 1>/dev/null 2>&1 + + # determine if dnvm now exists in the expected place + if [[ -f ~/.dnx/dnvm/dnvm.sh ]]; then + # add the dnvm folder to path + PATH=$PATH:~/.dnx/dnvm + + # source dnvm + source dnvm.sh + fi +fi + +# update dnvm on a background thead +screen -d -m -S "dnvm update" dnvm update-self diff --git a/src/scripts/flush-dns.sh b/src/scripts/flush-dns.sh new file mode 100644 index 0000000..3d7efd9 --- /dev/null +++ b/src/scripts/flush-dns.sh @@ -0,0 +1,8 @@ +function flush-dns() { + dscacheutil -flushcache + sudo killall -HUP mDNSResponder +} + +function flushdns() { + flush-dns +} \ No newline at end of file diff --git a/src/scripts/git-completion.sh b/src/scripts/git-completion.sh new file mode 100644 index 0000000..bfc74e9 --- /dev/null +++ b/src/scripts/git-completion.sh @@ -0,0 +1,2741 @@ +# bash/zsh completion support for core Git. +# +# Copyright (C) 2006,2007 Shawn O. Pearce +# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). +# Distributed under the GNU General Public License, version 2.0. +# +# The contained completion routines provide support for completing: +# +# *) local and remote branch names +# *) local and remote tag names +# *) .git/remotes file names +# *) git 'subcommands' +# *) tree paths within 'ref:path/to/file' expressions +# *) file paths within current working directory and index +# *) common --long-options +# +# To use these routines: +# +# 1) Copy this file to somewhere (e.g. ~/.git-completion.bash). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.git-completion.bash +# 3) Consider changing your PS1 to also show the current branch, +# see git-prompt.sh for details. +# +# If you use complex aliases of form '!f() { ... }; f', you can use the null +# command ':' as the first command in the function body to declare the desired +# completion style. For example '!f() { : git commit ; ... }; f' will +# tell the completion to use commit completion. This also works with aliases +# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". + +case "$COMP_WORDBREAKS" in +*:*) : great ;; +*) COMP_WORDBREAKS="$COMP_WORDBREAKS:" +esac + +# __gitdir accepts 0 or 1 arguments (i.e., location) +# returns location of .git repo +__gitdir () +{ + if [ -z "${1-}" ]; then + if [ -n "${__git_dir-}" ]; then + echo "$__git_dir" + elif [ -n "${GIT_DIR-}" ]; then + test -d "${GIT_DIR-}" || return 1 + echo "$GIT_DIR" + elif [ -d .git ]; then + echo .git + else + git rev-parse --git-dir 2>/dev/null + fi + elif [ -d "$1/.git" ]; then + echo "$1/.git" + else + echo "$1" + fi +} + +# The following function is based on code from: +# +# bash_completion - programmable completion functions for bash 3.2+ +# +# Copyright © 2006-2008, Ian Macdonald +# © 2009-2010, Bash Completion Maintainers +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The latest version of this software can be obtained here: +# +# http://bash-completion.alioth.debian.org/ +# +# RELEASE: 2.x + +# This function can be used to access a tokenized list of words +# on the command line: +# +# __git_reassemble_comp_words_by_ref '=:' +# if test "${words_[cword_-1]}" = -w +# then +# ... +# fi +# +# The argument should be a collection of characters from the list of +# word completion separators (COMP_WORDBREAKS) to treat as ordinary +# characters. +# +# This is roughly equivalent to going back in time and setting +# COMP_WORDBREAKS to exclude those characters. The intent is to +# make option types like --date= and : easy to +# recognize by treating each shell word as a single token. +# +# It is best not to set COMP_WORDBREAKS directly because the value is +# shared with other completion scripts. By the time the completion +# function gets called, COMP_WORDS has already been populated so local +# changes to COMP_WORDBREAKS have no effect. +# +# Output: words_, cword_, cur_. + +__git_reassemble_comp_words_by_ref() +{ + local exclude i j first + # Which word separators to exclude? + exclude="${1//[^$COMP_WORDBREAKS]}" + cword_=$COMP_CWORD + if [ -z "$exclude" ]; then + words_=("${COMP_WORDS[@]}") + return + fi + # List of word completion separators has shrunk; + # re-assemble words to complete. + for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Append each nonempty word consisting of just + # word separator characters to the current word. + first=t + while + [ $i -gt 0 ] && + [ -n "${COMP_WORDS[$i]}" ] && + # word consists of excluded word separators + [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] + do + # Attach to the previous token, + # unless the previous token is the command name. + if [ $j -ge 2 ] && [ -n "$first" ]; then + ((j--)) + fi + first= + words_[$j]=${words_[j]}${COMP_WORDS[i]} + if [ $i = $COMP_CWORD ]; then + cword_=$j + fi + if (($i < ${#COMP_WORDS[@]} - 1)); then + ((i++)) + else + # Done. + return + fi + done + words_[$j]=${words_[j]}${COMP_WORDS[i]} + if [ $i = $COMP_CWORD ]; then + cword_=$j + fi + done +} + +if ! type _get_comp_words_by_ref >/dev/null 2>&1; then +_get_comp_words_by_ref () +{ + local exclude cur_ words_ cword_ + if [ "$1" = "-n" ]; then + exclude=$2 + shift 2 + fi + __git_reassemble_comp_words_by_ref "$exclude" + cur_=${words_[cword_]} + while [ $# -gt 0 ]; do + case "$1" in + cur) + cur=$cur_ + ;; + prev) + prev=${words_[$cword_-1]} + ;; + words) + words=("${words_[@]}") + ;; + cword) + cword=$cword_ + ;; + esac + shift + done +} +fi + +__gitcompappend () +{ + local x i=${#COMPREPLY[@]} + for x in $1; do + if [[ "$x" == "$3"* ]]; then + COMPREPLY[i++]="$2$x$4" + fi + done +} + +__gitcompadd () +{ + COMPREPLY=() + __gitcompappend "$@" +} + +# Generates completion reply, appending a space to possible completion words, +# if necessary. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word (optional). +__gitcomp () +{ + local cur_="${3-$cur}" + + case "$cur_" in + --*=) + ;; + *) + local c i=0 IFS=$' \t\n' + for c in $1; do + c="$c${4-}" + if [[ $c == "$cur_"* ]]; then + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + COMPREPLY[i++]="${2-}$c" + fi + done + ;; + esac +} + +# Variation of __gitcomp_nl () that appends to the existing list of +# completion candidates, COMPREPLY. +__gitcomp_nl_append () +{ + local IFS=$'\n' + __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }" +} + +# Generates completion reply from newline-separated possible completion words +# by appending a space to all of them. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words, separated by a single newline. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word instead of +# the default space (optional). If specified but empty, nothing is +# appended. +__gitcomp_nl () +{ + COMPREPLY=() + __gitcomp_nl_append "$@" +} + +# Generates completion reply with compgen from newline-separated possible +# completion filenames. +# It accepts 1 to 3 arguments: +# 1: List of possible completion filenames, separated by a single newline. +# 2: A directory prefix to be added to each possible completion filename +# (optional). +# 3: Generate possible completion matches for this word (optional). +__gitcomp_file () +{ + local IFS=$'\n' + + # XXX does not work when the directory prefix contains a tilde, + # since tilde expansion is not applied. + # This means that COMPREPLY will be empty and Bash default + # completion will be used. + __gitcompadd "$1" "${2-}" "${3-$cur}" "" + + # use a hack to enable file mode in bash < 4 + compopt -o filenames +o nospace 2>/dev/null || + compgen -f /non-existing-dir/ > /dev/null +} + +# Execute 'git ls-files', unless the --committable option is specified, in +# which case it runs 'git diff-index' to find out the files that can be +# committed. It return paths relative to the directory specified in the first +# argument, and using the options specified in the second argument. +__git_ls_files_helper () +{ + if [ "$2" == "--committable" ]; then + git -C "$1" diff-index --name-only --relative HEAD + else + # NOTE: $2 is not quoted in order to support multiple options + git -C "$1" ls-files --exclude-standard $2 + fi 2>/dev/null +} + + +# __git_index_files accepts 1 or 2 arguments: +# 1: Options to pass to ls-files (required). +# 2: A directory path (optional). +# If provided, only files within the specified directory are listed. +# Sub directories are never recursed. Path must have a trailing +# slash. +__git_index_files () +{ + local dir="$(__gitdir)" root="${2-.}" file + + if [ -d "$dir" ]; then + __git_ls_files_helper "$root" "$1" | + while read -r file; do + case "$file" in + ?*/*) echo "${file%%/*}" ;; + *) echo "$file" ;; + esac + done | sort | uniq + fi +} + +__git_heads () +{ + local dir="$(__gitdir)" + if [ -d "$dir" ]; then + git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ + refs/heads + return + fi +} + +__git_tags () +{ + local dir="$(__gitdir)" + if [ -d "$dir" ]; then + git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ + refs/tags + return + fi +} + +# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments +# presence of 2nd argument means use the guess heuristic employed +# by checkout for tracking branches +__git_refs () +{ + local i hash dir="$(__gitdir "${1-}")" track="${2-}" + local format refs + if [ -d "$dir" ]; then + case "$cur" in + refs|refs/*) + format="refname" + refs="${cur%/*}" + track="" + ;; + *) + for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do + if [ -e "$dir/$i" ]; then echo $i; fi + done + format="refname:short" + refs="refs/tags refs/heads refs/remotes" + ;; + esac + git --git-dir="$dir" for-each-ref --format="%($format)" \ + $refs + if [ -n "$track" ]; then + # employ the heuristic used by git checkout + # Try to find a remote branch that matches the completion word + # but only output if the branch name is unique + local ref entry + git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ + "refs/remotes/" | \ + while read -r entry; do + eval "$entry" + ref="${ref#*/}" + if [[ "$ref" == "$cur"* ]]; then + echo "$ref" + fi + done | sort | uniq -u + fi + return + fi + case "$cur" in + refs|refs/*) + git ls-remote "$dir" "$cur*" 2>/dev/null | \ + while read -r hash i; do + case "$i" in + *^{}) ;; + *) echo "$i" ;; + esac + done + ;; + *) + echo "HEAD" + git for-each-ref --format="%(refname:short)" -- \ + "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##" + ;; + esac +} + +# __git_refs2 requires 1 argument (to pass to __git_refs) +__git_refs2 () +{ + local i + for i in $(__git_refs "$1"); do + echo "$i:$i" + done +} + +# __git_refs_remotes requires 1 argument (to pass to ls-remote) +__git_refs_remotes () +{ + local i hash + git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \ + while read -r hash i; do + echo "$i:refs/remotes/$1/${i#refs/heads/}" + done +} + +__git_remotes () +{ + local d="$(__gitdir)" + test -d "$d/remotes" && ls -1 "$d/remotes" + git --git-dir="$d" remote +} + +__git_list_merge_strategies () +{ + git merge -s help 2>&1 | + sed -n -e '/[Aa]vailable strategies are: /,/^$/{ + s/\.$// + s/.*:// + s/^[ ]*// + s/[ ]*$// + p + }' +} + +__git_merge_strategies= +# 'git merge -s help' (and thus detection of the merge strategy +# list) fails, unfortunately, if run outside of any git working +# tree. __git_merge_strategies is set to the empty string in +# that case, and the detection will be repeated the next time it +# is needed. +__git_compute_merge_strategies () +{ + test -n "$__git_merge_strategies" || + __git_merge_strategies=$(__git_list_merge_strategies) +} + +__git_complete_revlist_file () +{ + local pfx ls ref cur_="$cur" + case "$cur_" in + *..?*:*) + return + ;; + ?*:*) + ref="${cur_%%:*}" + cur_="${cur_#*:}" + case "$cur_" in + ?*/*) + pfx="${cur_%/*}" + cur_="${cur_##*/}" + ls="$ref:$pfx" + pfx="$pfx/" + ;; + *) + ls="$ref" + ;; + esac + + case "$COMP_WORDBREAKS" in + *:*) : great ;; + *) pfx="$ref:$pfx" ;; + esac + + __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \ + | sed '/^100... blob /{ + s,^.* ,, + s,$, , + } + /^120000 blob /{ + s,^.* ,, + s,$, , + } + /^040000 tree /{ + s,^.* ,, + s,$,/, + } + s/^.* //')" \ + "$pfx" "$cur_" "" + ;; + *...*) + pfx="${cur_%...*}..." + cur_="${cur_#*...}" + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + ;; + *..*) + pfx="${cur_%..*}.." + cur_="${cur_#*..}" + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac +} + + +# __git_complete_index_file requires 1 argument: +# 1: the options to pass to ls-file +# +# The exception is --committable, which finds the files appropriate commit. +__git_complete_index_file () +{ + local pfx="" cur_="$cur" + + case "$cur_" in + ?*/*) + pfx="${cur_%/*}" + cur_="${cur_##*/}" + pfx="${pfx}/" + ;; + esac + + __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_" +} + +__git_complete_file () +{ + __git_complete_revlist_file +} + +__git_complete_revlist () +{ + __git_complete_revlist_file +} + +__git_complete_remote_or_refspec () +{ + local cur_="$cur" cmd="${words[1]}" + local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0 + if [ "$cmd" = "remote" ]; then + ((c++)) + fi + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; + --all) + case "$cmd" in + push) no_complete_refspec=1 ;; + fetch) + return + ;; + *) ;; + esac + ;; + -*) ;; + *) remote="$i"; break ;; + esac + ((c++)) + done + if [ -z "$remote" ]; then + __gitcomp_nl "$(__git_remotes)" + return + fi + if [ $no_complete_refspec = 1 ]; then + return + fi + [ "$remote" = "." ] && remote= + case "$cur_" in + *:*) + case "$COMP_WORDBREAKS" in + *:*) : great ;; + *) pfx="${cur_%%:*}:" ;; + esac + cur_="${cur_#*:}" + lhs=0 + ;; + +*) + pfx="+" + cur_="${cur_#+}" + ;; + esac + case "$cmd" in + fetch) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + fi + ;; + pull|remote) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + fi + ;; + push) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" + fi + ;; + esac +} + +__git_complete_strategy () +{ + __git_compute_merge_strategies + case "$prev" in + -s|--strategy) + __gitcomp "$__git_merge_strategies" + return 0 + esac + case "$cur" in + --strategy=*) + __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" + return 0 + ;; + esac + return 1 +} + +__git_commands () { + if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}" + then + printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}" + else + git help -a|egrep '^ [a-zA-Z0-9]' + fi +} + +__git_list_all_commands () +{ + local i IFS=" "$'\n' + for i in $(__git_commands) + do + case $i in + *--*) : helper pattern;; + *) echo $i;; + esac + done +} + +__git_all_commands= +__git_compute_all_commands () +{ + test -n "$__git_all_commands" || + __git_all_commands=$(__git_list_all_commands) +} + +__git_list_porcelain_commands () +{ + local i IFS=" "$'\n' + __git_compute_all_commands + for i in $__git_all_commands + do + case $i in + *--*) : helper pattern;; + applymbox) : ask gittus;; + applypatch) : ask gittus;; + archimport) : import;; + cat-file) : plumbing;; + check-attr) : plumbing;; + check-ignore) : plumbing;; + check-mailmap) : plumbing;; + check-ref-format) : plumbing;; + checkout-index) : plumbing;; + commit-tree) : plumbing;; + count-objects) : infrequent;; + credential) : credentials;; + credential-*) : credentials helper;; + cvsexportcommit) : export;; + cvsimport) : import;; + cvsserver) : daemon;; + daemon) : daemon;; + diff-files) : plumbing;; + diff-index) : plumbing;; + diff-tree) : plumbing;; + fast-import) : import;; + fast-export) : export;; + fsck-objects) : plumbing;; + fetch-pack) : plumbing;; + fmt-merge-msg) : plumbing;; + for-each-ref) : plumbing;; + hash-object) : plumbing;; + http-*) : transport;; + index-pack) : plumbing;; + init-db) : deprecated;; + local-fetch) : plumbing;; + ls-files) : plumbing;; + ls-remote) : plumbing;; + ls-tree) : plumbing;; + mailinfo) : plumbing;; + mailsplit) : plumbing;; + merge-*) : plumbing;; + mktree) : plumbing;; + mktag) : plumbing;; + pack-objects) : plumbing;; + pack-redundant) : plumbing;; + pack-refs) : plumbing;; + parse-remote) : plumbing;; + patch-id) : plumbing;; + prune) : plumbing;; + prune-packed) : plumbing;; + quiltimport) : import;; + read-tree) : plumbing;; + receive-pack) : plumbing;; + remote-*) : transport;; + rerere) : plumbing;; + rev-list) : plumbing;; + rev-parse) : plumbing;; + runstatus) : plumbing;; + sh-setup) : internal;; + shell) : daemon;; + show-ref) : plumbing;; + send-pack) : plumbing;; + show-index) : plumbing;; + ssh-*) : transport;; + stripspace) : plumbing;; + symbolic-ref) : plumbing;; + unpack-file) : plumbing;; + unpack-objects) : plumbing;; + update-index) : plumbing;; + update-ref) : plumbing;; + update-server-info) : daemon;; + upload-archive) : plumbing;; + upload-pack) : plumbing;; + write-tree) : plumbing;; + var) : infrequent;; + verify-pack) : infrequent;; + verify-tag) : plumbing;; + *) echo $i;; + esac + done +} + +__git_porcelain_commands= +__git_compute_porcelain_commands () +{ + test -n "$__git_porcelain_commands" || + __git_porcelain_commands=$(__git_list_porcelain_commands) +} + +# Lists all set config variables starting with the given section prefix, +# with the prefix removed. +__git_get_config_variables () +{ + local section="$1" i IFS=$'\n' + for i in $(git --git-dir="$(__gitdir)" config --get-regexp "^$section\..*" 2>/dev/null); do + i="${i#$section.}" + echo "${i/ */}" + done +} + +__git_pretty_aliases () +{ + __git_get_config_variables "pretty" +} + +__git_aliases () +{ + __git_get_config_variables "alias" +} + +# __git_aliased_command requires 1 argument +__git_aliased_command () +{ + local word cmdline=$(git --git-dir="$(__gitdir)" \ + config --get "alias.$1") + for word in $cmdline; do + case "$word" in + \!gitk|gitk) + echo "gitk" + return + ;; + \!*) : shell command alias ;; + -*) : option ;; + *=*) : setting env ;; + git) : git itself ;; + \(\)) : skip parens of shell function definition ;; + {) : skip start of shell helper function ;; + :) : skip null command ;; + \'*) : skip opening quote after sh -c ;; + *) + echo "$word" + return + esac + done +} + +# __git_find_on_cmdline requires 1 argument +__git_find_on_cmdline () +{ + local word subcommand c=1 + while [ $c -lt $cword ]; do + word="${words[c]}" + for subcommand in $1; do + if [ "$subcommand" = "$word" ]; then + echo "$subcommand" + return + fi + done + ((c++)) + done +} + +__git_has_doubledash () +{ + local c=1 + while [ $c -lt $cword ]; do + if [ "--" = "${words[c]}" ]; then + return 0 + fi + ((c++)) + done + return 1 +} + +# Try to count non option arguments passed on the command line for the +# specified git command. +# When options are used, it is necessary to use the special -- option to +# tell the implementation were non option arguments begin. +# XXX this can not be improved, since options can appear everywhere, as +# an example: +# git mv x -n y +# +# __git_count_arguments requires 1 argument: the git command executed. +__git_count_arguments () +{ + local word i c=0 + + # Skip "git" (first argument) + for ((i=1; i < ${#words[@]}; i++)); do + word="${words[i]}" + + case "$word" in + --) + # Good; we can assume that the following are only non + # option arguments. + ((c = 0)) + ;; + "$1") + # Skip the specified git command and discard git + # main options + ((c = 0)) + ;; + ?*) + ((c++)) + ;; + esac + done + + printf "%d" $c +} + +__git_whitespacelist="nowarn warn error error-all fix" + +_git_am () +{ + local dir="$(__gitdir)" + if [ -d "$dir"/rebase-apply ]; then + __gitcomp "--skip --continue --resolved --abort" + return + fi + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --3way --committer-date-is-author-date --ignore-date + --ignore-whitespace --ignore-space-change + --interactive --keep --no-utf8 --signoff --utf8 + --whitespace= --scissors + " + return + esac +} + +_git_apply () +{ + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --stat --numstat --summary --check --index + --cached --index-info --reverse --reject --unidiff-zero + --apply --no-add --exclude= + --ignore-whitespace --ignore-space-change + --whitespace= --inaccurate-eof --verbose + " + return + esac +} + +_git_add () +{ + case "$cur" in + --*) + __gitcomp " + --interactive --refresh --patch --update --dry-run + --ignore-errors --intent-to-add + " + return + esac + + # XXX should we check for --update and --all options ? + __git_complete_index_file "--others --modified --directory --no-empty-directory" +} + +_git_archive () +{ + case "$cur" in + --format=*) + __gitcomp "$(git archive --list)" "" "${cur##--format=}" + return + ;; + --remote=*) + __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}" + return + ;; + --*) + __gitcomp " + --format= --list --verbose + --prefix= --remote= --exec= + " + return + ;; + esac + __git_complete_file +} + +_git_bisect () +{ + __git_has_doubledash && return + + local subcommands="start bad good skip reset visualize replay log run" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + if [ -f "$(__gitdir)"/BISECT_START ]; then + __gitcomp "$subcommands" + else + __gitcomp "replay start" + fi + return + fi + + case "$subcommand" in + bad|good|reset|skip|start) + __gitcomp_nl "$(__git_refs)" + ;; + *) + ;; + esac +} + +_git_branch () +{ + local i c=1 only_local_ref="n" has_r="n" + + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + -d|-m) only_local_ref="y" ;; + -r) has_r="y" ;; + esac + ((c++)) + done + + case "$cur" in + --set-upstream-to=*) + __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}" + ;; + --*) + __gitcomp " + --color --no-color --verbose --abbrev= --no-abbrev + --track --no-track --contains --merged --no-merged + --set-upstream-to= --edit-description --list + --unset-upstream + " + ;; + *) + if [ $only_local_ref = "y" -a $has_r = "n" ]; then + __gitcomp_nl "$(__git_heads)" + else + __gitcomp_nl "$(__git_refs)" + fi + ;; + esac +} + +_git_bundle () +{ + local cmd="${words[2]}" + case "$cword" in + 2) + __gitcomp "create list-heads verify unbundle" + ;; + 3) + # looking for a file + ;; + *) + case "$cmd" in + create) + __git_complete_revlist + ;; + esac + ;; + esac +} + +_git_checkout () +{ + __git_has_doubledash && return + + case "$cur" in + --conflict=*) + __gitcomp "diff3 merge" "" "${cur##--conflict=}" + ;; + --*) + __gitcomp " + --quiet --ours --theirs --track --no-track --merge + --conflict= --orphan --patch + " + ;; + *) + # check if --track, --no-track, or --no-guess was specified + # if so, disable DWIM mode + local flags="--track --no-track --no-guess" track=1 + if [ -n "$(__git_find_on_cmdline "$flags")" ]; then + track='' + fi + __gitcomp_nl "$(__git_refs '' $track)" + ;; + esac +} + +_git_cherry () +{ + __gitcomp_nl "$(__git_refs)" +} + +_git_cherry_pick () +{ + local dir="$(__gitdir)" + if [ -f "$dir"/CHERRY_PICK_HEAD ]; then + __gitcomp "--continue --quit --abort" + return + fi + case "$cur" in + --*) + __gitcomp "--edit --no-commit --signoff --strategy= --mainline" + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac +} + +_git_clean () +{ + case "$cur" in + --*) + __gitcomp "--dry-run --quiet" + return + ;; + esac + + # XXX should we check for -x option ? + __git_complete_index_file "--others --directory" +} + +_git_clone () +{ + case "$cur" in + --*) + __gitcomp " + --local + --no-hardlinks + --shared + --reference + --quiet + --no-checkout + --bare + --mirror + --origin + --upload-pack + --template= + --depth + --single-branch + --branch + " + return + ;; + esac +} + +_git_commit () +{ + case "$prev" in + -c|-C) + __gitcomp_nl "$(__git_refs)" "" "${cur}" + return + ;; + esac + + case "$cur" in + --cleanup=*) + __gitcomp "default strip verbatim whitespace + " "" "${cur##--cleanup=}" + return + ;; + --reuse-message=*|--reedit-message=*|\ + --fixup=*|--squash=*) + __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" + return + ;; + --untracked-files=*) + __gitcomp "all no normal" "" "${cur##--untracked-files=}" + return + ;; + --*) + __gitcomp " + --all --author= --signoff --verify --no-verify + --edit --no-edit + --amend --include --only --interactive + --dry-run --reuse-message= --reedit-message= + --reset-author --file= --message= --template= + --cleanup= --untracked-files --untracked-files= + --verbose --quiet --fixup= --squash= + " + return + esac + + if git rev-parse --verify --quiet HEAD >/dev/null; then + __git_complete_index_file "--committable" + else + # This is the first commit + __git_complete_index_file "--cached" + fi +} + +_git_describe () +{ + case "$cur" in + --*) + __gitcomp " + --all --tags --contains --abbrev= --candidates= + --exact-match --debug --long --match --always + " + return + esac + __gitcomp_nl "$(__git_refs)" +} + +__git_diff_algorithms="myers minimal patience histogram" + +__git_diff_common_options="--stat --numstat --shortstat --summary + --patch-with-stat --name-only --name-status --color + --no-color --color-words --no-renames --check + --full-index --binary --abbrev --diff-filter= + --find-copies-harder + --text --ignore-space-at-eol --ignore-space-change + --ignore-all-space --ignore-blank-lines --exit-code + --quiet --ext-diff --no-ext-diff + --no-prefix --src-prefix= --dst-prefix= + --inter-hunk-context= + --patience --histogram --minimal + --raw --word-diff + --dirstat --dirstat= --dirstat-by-file + --dirstat-by-file= --cumulative + --diff-algorithm= +" + +_git_diff () +{ + __git_has_doubledash && return + + case "$cur" in + --diff-algorithm=*) + __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" + return + ;; + --*) + __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex + --base --ours --theirs --no-index + $__git_diff_common_options + " + return + ;; + esac + __git_complete_revlist_file +} + +__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff + tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare +" + +_git_difftool () +{ + __git_has_doubledash && return + + case "$cur" in + --tool=*) + __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}" + return + ;; + --*) + __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex + --base --ours --theirs + --no-renames --diff-filter= --find-copies-harder + --relative --ignore-submodules + --tool=" + return + ;; + esac + __git_complete_revlist_file +} + +__git_fetch_recurse_submodules="yes on-demand no" + +__git_fetch_options=" + --quiet --verbose --append --upload-pack --force --keep --depth= + --tags --no-tags --all --prune --dry-run --recurse-submodules= +" + +_git_fetch () +{ + case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --*) + __gitcomp "$__git_fetch_options" + return + ;; + esac + __git_complete_remote_or_refspec +} + +__git_format_patch_options=" + --stdout --attach --no-attach --thread --thread= --no-thread + --numbered --start-number --numbered-files --keep-subject --signoff + --signature --no-signature --in-reply-to= --cc= --full-index --binary + --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix= + --inline --suffix= --ignore-if-in-upstream --subject-prefix= + --output-directory --reroll-count --to= --quiet --notes +" + +_git_format_patch () +{ + case "$cur" in + --thread=*) + __gitcomp " + deep shallow + " "" "${cur##--thread=}" + return + ;; + --*) + __gitcomp "$__git_format_patch_options" + return + ;; + esac + __git_complete_revlist +} + +_git_fsck () +{ + case "$cur" in + --*) + __gitcomp " + --tags --root --unreachable --cache --no-reflogs --full + --strict --verbose --lost-found + " + return + ;; + esac +} + +_git_gc () +{ + case "$cur" in + --*) + __gitcomp "--prune --aggressive" + return + ;; + esac +} + +_git_gitk () +{ + _gitk +} + +__git_match_ctag() { + awk "/^${1//\//\\/}/ { print \$1 }" "$2" +} + +_git_grep () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp " + --cached + --text --ignore-case --word-regexp --invert-match + --full-name --line-number + --extended-regexp --basic-regexp --fixed-strings + --perl-regexp + --files-with-matches --name-only + --files-without-match + --max-depth + --count + --and --or --not --all-match + " + return + ;; + esac + + case "$cword,$prev" in + 2,*|*,-*) + if test -r tags; then + __gitcomp_nl "$(__git_match_ctag "$cur" tags)" + return + fi + ;; + esac + + __gitcomp_nl "$(__git_refs)" +} + +_git_help () +{ + case "$cur" in + --*) + __gitcomp "--all --info --man --web" + return + ;; + esac + __git_compute_all_commands + __gitcomp "$__git_all_commands $(__git_aliases) + attributes cli core-tutorial cvs-migration + diffcore gitk glossary hooks ignore modules + namespaces repository-layout tutorial tutorial-2 + workflows + " +} + +_git_init () +{ + case "$cur" in + --shared=*) + __gitcomp " + false true umask group all world everybody + " "" "${cur##--shared=}" + return + ;; + --*) + __gitcomp "--quiet --bare --template= --shared --shared=" + return + ;; + esac +} + +_git_ls_files () +{ + case "$cur" in + --*) + __gitcomp "--cached --deleted --modified --others --ignored + --stage --directory --no-empty-directory --unmerged + --killed --exclude= --exclude-from= + --exclude-per-directory= --exclude-standard + --error-unmatch --with-tree= --full-name + --abbrev --ignored --exclude-per-directory + " + return + ;; + esac + + # XXX ignore options like --modified and always suggest all cached + # files. + __git_complete_index_file "--cached" +} + +_git_ls_remote () +{ + __gitcomp_nl "$(__git_remotes)" +} + +_git_ls_tree () +{ + __git_complete_file +} + +# Options that go well for log, shortlog and gitk +__git_log_common_options=" + --not --all + --branches --tags --remotes + --first-parent --merges --no-merges + --max-count= + --max-age= --since= --after= + --min-age= --until= --before= + --min-parents= --max-parents= + --no-min-parents --no-max-parents +" +# Options that go well for log and gitk (not shortlog) +__git_log_gitk_options=" + --dense --sparse --full-history + --simplify-merges --simplify-by-decoration + --left-right --notes --no-notes +" +# Options that go well for log and shortlog (not gitk) +__git_log_shortlog_options=" + --author= --committer= --grep= + --all-match --invert-grep +" + +__git_log_pretty_formats="oneline short medium full fuller email raw format:" +__git_log_date_formats="relative iso8601 rfc2822 short local default raw" + +_git_log () +{ + __git_has_doubledash && return + + local g="$(git rev-parse --git-dir 2>/dev/null)" + local merge="" + if [ -f "$g/MERGE_HEAD" ]; then + merge="--merge" + fi + case "$cur" in + --pretty=*|--format=*) + __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) + " "" "${cur#*=}" + return + ;; + --date=*) + __gitcomp "$__git_log_date_formats" "" "${cur##--date=}" + return + ;; + --decorate=*) + __gitcomp "full short no" "" "${cur##--decorate=}" + return + ;; + --*) + __gitcomp " + $__git_log_common_options + $__git_log_shortlog_options + $__git_log_gitk_options + --root --topo-order --date-order --reverse + --follow --full-diff + --abbrev-commit --abbrev= + --relative-date --date= + --pretty= --format= --oneline + --show-signature + --cherry-pick + --graph + --decorate --decorate= + --walk-reflogs + --parents --children + $merge + $__git_diff_common_options + --pickaxe-all --pickaxe-regex + " + return + ;; + esac + __git_complete_revlist +} + +# Common merge options shared by git-merge(1) and git-pull(1). +__git_merge_options=" + --no-commit --no-stat --log --no-log --squash --strategy + --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit + --verify-signatures --no-verify-signatures --gpg-sign + --quiet --verbose --progress --no-progress +" + +_git_merge () +{ + __git_complete_strategy && return + + case "$cur" in + --*) + __gitcomp "$__git_merge_options + --rerere-autoupdate --no-rerere-autoupdate --abort" + return + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_mergetool () +{ + case "$cur" in + --tool=*) + __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}" + return + ;; + --*) + __gitcomp "--tool=" + return + ;; + esac +} + +_git_merge_base () +{ + case "$cur" in + --*) + __gitcomp "--octopus --independent --is-ancestor --fork-point" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_mv () +{ + case "$cur" in + --*) + __gitcomp "--dry-run" + return + ;; + esac + + if [ $(__git_count_arguments "mv") -gt 0 ]; then + # We need to show both cached and untracked files (including + # empty directories) since this may not be the last argument. + __git_complete_index_file "--cached --others --directory" + else + __git_complete_index_file "--cached" + fi +} + +_git_name_rev () +{ + __gitcomp "--tags --all --stdin" +} + +_git_notes () +{ + local subcommands='add append copy edit list prune remove show' + local subcommand="$(__git_find_on_cmdline "$subcommands")" + + case "$subcommand,$cur" in + ,--*) + __gitcomp '--ref' + ;; + ,*) + case "$prev" in + --ref) + __gitcomp_nl "$(__git_refs)" + ;; + *) + __gitcomp "$subcommands --ref" + ;; + esac + ;; + add,--reuse-message=*|append,--reuse-message=*|\ + add,--reedit-message=*|append,--reedit-message=*) + __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" + ;; + add,--*|append,--*) + __gitcomp '--file= --message= --reedit-message= + --reuse-message=' + ;; + copy,--*) + __gitcomp '--stdin' + ;; + prune,--*) + __gitcomp '--dry-run --verbose' + ;; + prune,*) + ;; + *) + case "$prev" in + -m|-F) + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac + ;; + esac +} + +_git_pull () +{ + __git_complete_strategy && return + + case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --*) + __gitcomp " + --rebase --no-rebase + $__git_merge_options + $__git_fetch_options + " + return + ;; + esac + __git_complete_remote_or_refspec +} + +__git_push_recurse_submodules="check on-demand" + +__git_complete_force_with_lease () +{ + local cur_=$1 + + case "$cur_" in + --*=) + ;; + *:*) + __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}" + ;; + *) + __gitcomp_nl "$(__git_refs)" "" "$cur_" + ;; + esac +} + +_git_push () +{ + case "$prev" in + --repo) + __gitcomp_nl "$(__git_remotes)" + return + ;; + --recurse-submodules) + __gitcomp "$__git_push_recurse_submodules" + return + ;; + esac + case "$cur" in + --repo=*) + __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" + return + ;; + --recurse-submodules=*) + __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --force-with-lease=*) + __git_complete_force_with_lease "${cur##--force-with-lease=}" + return + ;; + --*) + __gitcomp " + --all --mirror --tags --dry-run --force --verbose + --quiet --prune --delete --follow-tags + --receive-pack= --repo= --set-upstream + --force-with-lease --force-with-lease= --recurse-submodules= + " + return + ;; + esac + __git_complete_remote_or_refspec +} + +_git_rebase () +{ + local dir="$(__gitdir)" + if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then + __gitcomp "--continue --skip --abort" + return + fi + __git_complete_strategy && return + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --onto --merge --strategy --interactive + --preserve-merges --stat --no-stat + --committer-date-is-author-date --ignore-date + --ignore-whitespace --whitespace= + --autosquash --fork-point --no-fork-point + --autostash + " + + return + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_reflog () +{ + local subcommands="show delete expire" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + else + __gitcomp_nl "$(__git_refs)" + fi +} + +__git_send_email_confirm_options="always never auto cc compose" +__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all" + +_git_send_email () +{ + case "$cur" in + --confirm=*) + __gitcomp " + $__git_send_email_confirm_options + " "" "${cur##--confirm=}" + return + ;; + --suppress-cc=*) + __gitcomp " + $__git_send_email_suppresscc_options + " "" "${cur##--suppress-cc=}" + + return + ;; + --smtp-encryption=*) + __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}" + return + ;; + --thread=*) + __gitcomp " + deep shallow + " "" "${cur##--thread=}" + return + ;; + --*) + __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to + --compose --confirm= --dry-run --envelope-sender + --from --identity + --in-reply-to --no-chain-reply-to --no-signed-off-by-cc + --no-suppress-from --no-thread --quiet + --signed-off-by-cc --smtp-pass --smtp-server + --smtp-server-port --smtp-encryption= --smtp-user + --subject --suppress-cc= --suppress-from --thread --to + --validate --no-validate + $__git_format_patch_options" + return + ;; + esac + __git_complete_revlist +} + +_git_stage () +{ + _git_add +} + +__git_config_get_set_variables () +{ + local prevword word config_file= c=$cword + while [ $c -gt 1 ]; do + word="${words[c]}" + case "$word" in + --system|--global|--local|--file=*) + config_file="$word" + break + ;; + -f|--file) + config_file="$word $prevword" + break + ;; + esac + prevword=$word + c=$((--c)) + done + + git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | + while read -r line + do + case "$line" in + *.*=*) + echo "${line/=*/}" + ;; + esac + done +} + +_git_config () +{ + case "$prev" in + branch.*.remote|branch.*.pushremote) + __gitcomp_nl "$(__git_remotes)" + return + ;; + branch.*.merge) + __gitcomp_nl "$(__git_refs)" + return + ;; + branch.*.rebase) + __gitcomp "false true" + return + ;; + remote.pushdefault) + __gitcomp_nl "$(__git_remotes)" + return + ;; + remote.*.fetch) + local remote="${prev#remote.}" + remote="${remote%.fetch}" + if [ -z "$cur" ]; then + __gitcomp_nl "refs/heads/" "" "" "" + return + fi + __gitcomp_nl "$(__git_refs_remotes "$remote")" + return + ;; + remote.*.push) + local remote="${prev#remote.}" + remote="${remote%.push}" + __gitcomp_nl "$(git --git-dir="$(__gitdir)" \ + for-each-ref --format='%(refname):%(refname)' \ + refs/heads)" + return + ;; + pull.twohead|pull.octopus) + __git_compute_merge_strategies + __gitcomp "$__git_merge_strategies" + return + ;; + color.branch|color.diff|color.interactive|\ + color.showbranch|color.status|color.ui) + __gitcomp "always never auto" + return + ;; + color.pager) + __gitcomp "false true" + return + ;; + color.*.*) + __gitcomp " + normal black red green yellow blue magenta cyan white + bold dim ul blink reverse + " + return + ;; + diff.submodule) + __gitcomp "log short" + return + ;; + help.format) + __gitcomp "man info web html" + return + ;; + log.date) + __gitcomp "$__git_log_date_formats" + return + ;; + sendemail.aliasesfiletype) + __gitcomp "mutt mailrc pine elm gnus" + return + ;; + sendemail.confirm) + __gitcomp "$__git_send_email_confirm_options" + return + ;; + sendemail.suppresscc) + __gitcomp "$__git_send_email_suppresscc_options" + return + ;; + sendemail.transferencoding) + __gitcomp "7bit 8bit quoted-printable base64" + return + ;; + --get|--get-all|--unset|--unset-all) + __gitcomp_nl "$(__git_config_get_set_variables)" + return + ;; + *.*) + return + ;; + esac + case "$cur" in + --*) + __gitcomp " + --system --global --local --file= + --list --replace-all + --get --get-all --get-regexp + --add --unset --unset-all + --remove-section --rename-section + " + return + ;; + branch.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_" + return + ;; + branch.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "." + __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_" + return + ;; + guitool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp " + argprompt cmd confirm needsfile noconsole norescan + prompt revprompt revunmerged title + " "$pfx" "$cur_" + return + ;; + difftool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path" "$pfx" "$cur_" + return + ;; + man.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path" "$pfx" "$cur_" + return + ;; + mergetool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path trustExitCode" "$pfx" "$cur_" + return + ;; + pager.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __git_compute_all_commands + __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" + return + ;; + remote.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp " + url proxy fetch push mirror skipDefaultUpdate + receivepack uploadpack tagopt pushurl + " "$pfx" "$cur_" + return + ;; + remote.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." + __gitcomp_nl_append "pushdefault" "$pfx" "$cur_" + return + ;; + url.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" + return + ;; + esac + __gitcomp " + add.ignoreErrors + advice.commitBeforeMerge + advice.detachedHead + advice.implicitIdentity + advice.pushNonFastForward + advice.resolveConflict + advice.statusHints + alias. + am.keepcr + apply.ignorewhitespace + apply.whitespace + branch.autosetupmerge + branch.autosetuprebase + browser. + clean.requireForce + color.branch + color.branch.current + color.branch.local + color.branch.plain + color.branch.remote + color.decorate.HEAD + color.decorate.branch + color.decorate.remoteBranch + color.decorate.stash + color.decorate.tag + color.diff + color.diff.commit + color.diff.frag + color.diff.func + color.diff.meta + color.diff.new + color.diff.old + color.diff.plain + color.diff.whitespace + color.grep + color.grep.context + color.grep.filename + color.grep.function + color.grep.linenumber + color.grep.match + color.grep.selected + color.grep.separator + color.interactive + color.interactive.error + color.interactive.header + color.interactive.help + color.interactive.prompt + color.pager + color.showbranch + color.status + color.status.added + color.status.changed + color.status.header + color.status.nobranch + color.status.unmerged + color.status.untracked + color.status.updated + color.ui + commit.status + commit.template + core.abbrev + core.askpass + core.attributesfile + core.autocrlf + core.bare + core.bigFileThreshold + core.compression + core.createObject + core.deltaBaseCacheLimit + core.editor + core.eol + core.excludesfile + core.fileMode + core.fsyncobjectfiles + core.gitProxy + core.ignoreStat + core.ignorecase + core.logAllRefUpdates + core.loosecompression + core.notesRef + core.packedGitLimit + core.packedGitWindowSize + core.pager + core.preferSymlinkRefs + core.preloadindex + core.quotepath + core.repositoryFormatVersion + core.safecrlf + core.sharedRepository + core.sparseCheckout + core.symlinks + core.trustctime + core.warnAmbiguousRefs + core.whitespace + core.worktree + diff.autorefreshindex + diff.external + diff.ignoreSubmodules + diff.mnemonicprefix + diff.noprefix + diff.renameLimit + diff.renames + diff.statGraphWidth + diff.submodule + diff.suppressBlankEmpty + diff.tool + diff.wordRegex + diff.algorithm + difftool. + difftool.prompt + fetch.recurseSubmodules + fetch.unpackLimit + format.attach + format.cc + format.coverLetter + format.headers + format.numbered + format.pretty + format.signature + format.signoff + format.subjectprefix + format.suffix + format.thread + format.to + gc. + gc.aggressiveWindow + gc.auto + gc.autopacklimit + gc.packrefs + gc.pruneexpire + gc.reflogexpire + gc.reflogexpireunreachable + gc.rerereresolved + gc.rerereunresolved + gitcvs.allbinary + gitcvs.commitmsgannotation + gitcvs.dbTableNamePrefix + gitcvs.dbdriver + gitcvs.dbname + gitcvs.dbpass + gitcvs.dbuser + gitcvs.enabled + gitcvs.logfile + gitcvs.usecrlfattr + guitool. + gui.blamehistoryctx + gui.commitmsgwidth + gui.copyblamethreshold + gui.diffcontext + gui.encoding + gui.fastcopyblame + gui.matchtrackingbranch + gui.newbranchtemplate + gui.pruneduringfetch + gui.spellingdictionary + gui.trustmtime + help.autocorrect + help.browser + help.format + http.lowSpeedLimit + http.lowSpeedTime + http.maxRequests + http.minSessions + http.noEPSV + http.postBuffer + http.proxy + http.sslCipherList + http.sslCAInfo + http.sslCAPath + http.sslCert + http.sslCertPasswordProtected + http.sslKey + http.sslVerify + http.useragent + i18n.commitEncoding + i18n.logOutputEncoding + imap.authMethod + imap.folder + imap.host + imap.pass + imap.port + imap.preformattedHTML + imap.sslverify + imap.tunnel + imap.user + init.templatedir + instaweb.browser + instaweb.httpd + instaweb.local + instaweb.modulepath + instaweb.port + interactive.singlekey + log.date + log.decorate + log.showroot + mailmap.file + man. + man.viewer + merge. + merge.conflictstyle + merge.log + merge.renameLimit + merge.renormalize + merge.stat + merge.tool + merge.verbosity + mergetool. + mergetool.keepBackup + mergetool.keepTemporaries + mergetool.prompt + notes.displayRef + notes.rewrite. + notes.rewrite.amend + notes.rewrite.rebase + notes.rewriteMode + notes.rewriteRef + pack.compression + pack.deltaCacheLimit + pack.deltaCacheSize + pack.depth + pack.indexVersion + pack.packSizeLimit + pack.threads + pack.window + pack.windowMemory + pager. + pretty. + pull.octopus + pull.twohead + push.default + push.followTags + rebase.autosquash + rebase.stat + receive.autogc + receive.denyCurrentBranch + receive.denyDeleteCurrent + receive.denyDeletes + receive.denyNonFastForwards + receive.fsckObjects + receive.unpackLimit + receive.updateserverinfo + remote.pushdefault + remotes. + repack.usedeltabaseoffset + rerere.autoupdate + rerere.enabled + sendemail. + sendemail.aliasesfile + sendemail.aliasfiletype + sendemail.bcc + sendemail.cc + sendemail.cccmd + sendemail.chainreplyto + sendemail.confirm + sendemail.envelopesender + sendemail.from + sendemail.identity + sendemail.multiedit + sendemail.signedoffbycc + sendemail.smtpdomain + sendemail.smtpencryption + sendemail.smtppass + sendemail.smtpserver + sendemail.smtpserveroption + sendemail.smtpserverport + sendemail.smtpuser + sendemail.suppresscc + sendemail.suppressfrom + sendemail.thread + sendemail.to + sendemail.validate + showbranch.default + status.relativePaths + status.showUntrackedFiles + status.submodulesummary + submodule. + tar.umask + transfer.unpackLimit + url. + user.email + user.name + user.signingkey + web.browser + branch. remote. + " +} + +_git_remote () +{ + local subcommands="add rename remove set-head set-branches set-url show prune update" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + return + fi + + case "$subcommand" in + rename|remove|set-url|show|prune) + __gitcomp_nl "$(__git_remotes)" + ;; + set-head|set-branches) + __git_complete_remote_or_refspec + ;; + update) + __gitcomp "$(__git_get_config_variables "remotes")" + ;; + *) + ;; + esac +} + +_git_replace () +{ + __gitcomp_nl "$(__git_refs)" +} + +_git_reset () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp "--merge --mixed --hard --soft --patch" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_revert () +{ + case "$cur" in + --*) + __gitcomp "--edit --mainline --no-edit --no-commit --signoff" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_rm () +{ + case "$cur" in + --*) + __gitcomp "--cached --dry-run --ignore-unmatch --quiet" + return + ;; + esac + + __git_complete_index_file "--cached" +} + +_git_shortlog () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp " + $__git_log_common_options + $__git_log_shortlog_options + --numbered --summary + " + return + ;; + esac + __git_complete_revlist +} + +_git_show () +{ + __git_has_doubledash && return + + case "$cur" in + --pretty=*|--format=*) + __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) + " "" "${cur#*=}" + return + ;; + --diff-algorithm=*) + __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" + return + ;; + --*) + __gitcomp "--pretty= --format= --abbrev-commit --oneline + --show-signature + $__git_diff_common_options + " + return + ;; + esac + __git_complete_revlist_file +} + +_git_show_branch () +{ + case "$cur" in + --*) + __gitcomp " + --all --remotes --topo-order --current --more= + --list --independent --merge-base --no-name + --color --no-color + --sha1-name --sparse --topics --reflog + " + return + ;; + esac + __git_complete_revlist +} + +_git_stash () +{ + local save_opts='--keep-index --no-keep-index --quiet --patch' + local subcommands='save list show apply clear drop pop create branch' + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + case "$cur" in + --*) + __gitcomp "$save_opts" + ;; + *) + if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then + __gitcomp "$subcommands" + fi + ;; + esac + else + case "$subcommand,$cur" in + save,--*) + __gitcomp "$save_opts" + ;; + apply,--*|pop,--*) + __gitcomp "--index --quiet" + ;; + show,--*|drop,--*|branch,--*) + ;; + show,*|apply,*|drop,*|pop,*|branch,*) + __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ + | sed -n -e 's/:.*//p')" + ;; + *) + ;; + esac + fi +} + +_git_submodule () +{ + __git_has_doubledash && return + + local subcommands="add status init deinit update summary foreach sync" + if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then + case "$cur" in + --*) + __gitcomp "--quiet --cached" + ;; + *) + __gitcomp "$subcommands" + ;; + esac + return + fi +} + +_git_svn () +{ + local subcommands=" + init fetch clone rebase dcommit log find-rev + set-tree commit-diff info create-ignore propget + proplist show-ignore show-externals branch tag blame + migrate mkdirs reset gc + " + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + else + local remote_opts="--username= --config-dir= --no-auth-cache" + local fc_opts=" + --follow-parent --authors-file= --repack= + --no-metadata --use-svm-props --use-svnsync-props + --log-window-size= --no-checkout --quiet + --repack-flags --use-log-author --localtime + --ignore-paths= --include-paths= $remote_opts + " + local init_opts=" + --template= --shared= --trunk= --tags= + --branches= --stdlayout --minimize-url + --no-metadata --use-svm-props --use-svnsync-props + --rewrite-root= --prefix= --use-log-author + --add-author-from $remote_opts + " + local cmt_opts=" + --edit --rmdir --find-copies-harder --copy-similarity= + " + + case "$subcommand,$cur" in + fetch,--*) + __gitcomp "--revision= --fetch-all $fc_opts" + ;; + clone,--*) + __gitcomp "--revision= $fc_opts $init_opts" + ;; + init,--*) + __gitcomp "$init_opts" + ;; + dcommit,--*) + __gitcomp " + --merge --strategy= --verbose --dry-run + --fetch-all --no-rebase --commit-url + --revision --interactive $cmt_opts $fc_opts + " + ;; + set-tree,--*) + __gitcomp "--stdin $cmt_opts $fc_opts" + ;; + create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\ + show-externals,--*|mkdirs,--*) + __gitcomp "--revision=" + ;; + log,--*) + __gitcomp " + --limit= --revision= --verbose --incremental + --oneline --show-commit --non-recursive + --authors-file= --color + " + ;; + rebase,--*) + __gitcomp " + --merge --verbose --strategy= --local + --fetch-all --dry-run $fc_opts + " + ;; + commit-diff,--*) + __gitcomp "--message= --file= --revision= $cmt_opts" + ;; + info,--*) + __gitcomp "--url" + ;; + branch,--*) + __gitcomp "--dry-run --message --tag" + ;; + tag,--*) + __gitcomp "--dry-run --message" + ;; + blame,--*) + __gitcomp "--git-format" + ;; + migrate,--*) + __gitcomp " + --config-dir= --ignore-paths= --minimize + --no-auth-cache --username= + " + ;; + reset,--*) + __gitcomp "--revision= --parent" + ;; + *) + ;; + esac + fi +} + +_git_tag () +{ + local i c=1 f=0 + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + -d|-v) + __gitcomp_nl "$(__git_tags)" + return + ;; + -f) + f=1 + ;; + esac + ((c++)) + done + + case "$prev" in + -m|-F) + ;; + -*|tag) + if [ $f = 1 ]; then + __gitcomp_nl "$(__git_tags)" + fi + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac + + case "$cur" in + --*) + __gitcomp " + --list --delete --verify --annotate --message --file + --sign --cleanup --local-user --force --column --sort + --contains --points-at + " + ;; + esac +} + +_git_whatchanged () +{ + _git_log +} + +__git_main () +{ + local i c=1 command __git_dir + + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + --git-dir=*) __git_dir="${i#--git-dir=}" ;; + --git-dir) ((c++)) ; __git_dir="${words[c]}" ;; + --bare) __git_dir="." ;; + --help) command="help"; break ;; + -c|--work-tree|--namespace) ((c++)) ;; + -*) ;; + *) command="$i"; break ;; + esac + ((c++)) + done + + if [ -z "$command" ]; then + case "$cur" in + --*) __gitcomp " + --paginate + --no-pager + --git-dir= + --bare + --version + --exec-path + --exec-path= + --html-path + --man-path + --info-path + --work-tree= + --namespace= + --no-replace-objects + --help + " + ;; + *) __git_compute_porcelain_commands + __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; + esac + return + fi + + local completion_func="_git_${command//-/_}" + declare -f $completion_func >/dev/null && $completion_func && return + + local expansion=$(__git_aliased_command "$command") + if [ -n "$expansion" ]; then + words[1]=$expansion + completion_func="_git_${expansion//-/_}" + declare -f $completion_func >/dev/null && $completion_func + fi +} + +__gitk_main () +{ + __git_has_doubledash && return + + local g="$(__gitdir)" + local merge="" + if [ -f "$g/MERGE_HEAD" ]; then + merge="--merge" + fi + case "$cur" in + --*) + __gitcomp " + $__git_log_common_options + $__git_log_gitk_options + $merge + " + return + ;; + esac + __git_complete_revlist +} + +if [[ -n ${ZSH_VERSION-} ]]; then + echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2 + + autoload -U +X compinit && compinit + + __gitcomp () + { + emulate -L zsh + + local cur_="${3-$cur}" + + case "$cur_" in + --*=) + ;; + *) + local c IFS=$' \t\n' + local -a array + for c in ${=1}; do + c="$c${4-}" + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + array[${#array[@]}+1]="$c" + done + compset -P '*[=:]' + compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 + ;; + esac + } + + __gitcomp_nl () + { + emulate -L zsh + + local IFS=$'\n' + compset -P '*[=:]' + compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 + } + + __gitcomp_file () + { + emulate -L zsh + + local IFS=$'\n' + compset -P '*[=:]' + compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 + } + + _git () + { + local _ret=1 cur cword prev + cur=${words[CURRENT]} + prev=${words[CURRENT-1]} + let cword=CURRENT-1 + emulate ksh -c __${service}_main + let _ret && _default && _ret=0 + return _ret + } + + compdef _git git gitk + return +fi + +__git_func_wrap () +{ + local cur words cword prev + _get_comp_words_by_ref -n =: cur words cword prev + $1 +} + +# Setup completion for certain functions defined above by setting common +# variables and workarounds. +# This is NOT a public function; use at your own risk. +__git_complete () +{ + local wrapper="__git_wrap${2}" + eval "$wrapper () { __git_func_wrap $2 ; }" + complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ + || complete -o default -o nospace -F $wrapper $1 +} + +# wrapper for backwards compatibility +_git () +{ + __git_wrap__git_main +} + +# wrapper for backwards compatibility +_gitk () +{ + __git_wrap__gitk_main +} + +__git_complete git __git_main +__git_complete gitk __gitk_main + +# The following are necessary only for Cygwin, and only are needed +# when the user has tab-completed the executable name and consequently +# included the '.exe' suffix. +# +if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then +__git_complete git.exe __git_main +fi diff --git a/src/scripts/git-prompt.sh b/src/scripts/git-prompt.sh new file mode 100644 index 0000000..f18aedc --- /dev/null +++ b/src/scripts/git-prompt.sh @@ -0,0 +1,528 @@ +# bash/zsh git prompt support +# +# Copyright (C) 2006,2007 Shawn O. Pearce +# Distributed under the GNU General Public License, version 2.0. +# +# This script allows you to see repository status in your prompt. +# +# To enable: +# +# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.git-prompt.sh +# 3a) Change your PS1 to call __git_ps1 as +# command-substitution: +# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' +# ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +# the optional argument will be used as format string. +# 3b) Alternatively, for a slightly faster prompt, __git_ps1 can +# be used for PROMPT_COMMAND in Bash or for precmd() in Zsh +# with two parameters,
 and , which are strings
+#        you would put in $PS1 before and after the status string
+#        generated by the git-prompt machinery.  e.g.
+#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
+#          will show username, at-sign, host, colon, cwd, then
+#          various status string, followed by dollar and SP, as
+#          your prompt.
+#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
+#          will show username, pipe, then various status string,
+#          followed by colon, cwd, dollar and SP, as your prompt.
+#        Optionally, you can supply a third argument with a printf
+#        format string to finetune the output of the branch status
+#
+# The repository status will be displayed only if you are currently in a
+# git repository. The %s token is the placeholder for the shown status.
+#
+# The prompt status always includes the current branch name.
+#
+# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
+# unstaged (*) and staged (+) changes will be shown next to the branch
+# name.  You can configure this per-repository with the
+# bash.showDirtyState variable, which defaults to true once
+# GIT_PS1_SHOWDIRTYSTATE is enabled.
+#
+# You can also see if currently something is stashed, by setting
+# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
+# then a '$' will be shown next to the branch name.
+#
+# If you would like to see if there're untracked files, then you can set
+# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
+# files, then a '%' will be shown next to the branch name.  You can
+# configure this per-repository with the bash.showUntrackedFiles
+# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
+# enabled.
+#
+# If you would like to see the difference between HEAD and its upstream,
+# set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">"
+# indicates you are ahead, "<>" indicates you have diverged and "="
+# indicates that there is no difference. You can further control
+# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
+# of values:
+#
+#     verbose       show number of commits ahead/behind (+/-) upstream
+#     name          if verbose, then also show the upstream abbrev name
+#     legacy        don't use the '--count' option available in recent
+#                   versions of git-rev-list
+#     git           always compare HEAD to @{upstream}
+#     svn           always compare HEAD to your SVN upstream
+#
+# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
+# find one, or @{upstream} otherwise.  Once you have set
+# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
+# setting the bash.showUpstream config variable.
+#
+# If you would like to see more information about the identity of
+# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
+# to one of these values:
+#
+#     contains      relative to newer annotated tag (v1.6.3.2~35)
+#     branch        relative to newer tag or branch (master~4)
+#     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
+#     default       exactly matching tag
+#
+# If you would like a colored hint about the current dirty state, set
+# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
+# the colored output of "git status -sb" and are available only when
+# using __git_ps1 for PROMPT_COMMAND or precmd.
+#
+# If you would like __git_ps1 to do nothing in the case when the current
+# directory is set up to be ignored by git, then set
+# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
+# repository level by setting bash.hideIfPwdIgnored to "false".
+
+# check whether printf supports -v
+__git_printf_supports_v=
+printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
+
+# stores the divergence from upstream in $p
+# used by GIT_PS1_SHOWUPSTREAM
+__git_ps1_show_upstream ()
+{
+	local key value
+	local svn_remote svn_url_pattern count n
+	local upstream=git legacy="" verbose="" name=""
+
+	svn_remote=()
+	# get some config options from git-config
+	local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
+	while read -r key value; do
+		case "$key" in
+		bash.showupstream)
+			GIT_PS1_SHOWUPSTREAM="$value"
+			if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
+				p=""
+				return
+			fi
+			;;
+		svn-remote.*.url)
+			svn_remote[$((${#svn_remote[@]} + 1))]="$value"
+			svn_url_pattern="$svn_url_pattern\\|$value"
+			upstream=svn+git # default upstream is SVN if available, else git
+			;;
+		esac
+	done <<< "$output"
+
+	# parse configuration values
+	for option in ${GIT_PS1_SHOWUPSTREAM}; do
+		case "$option" in
+		git|svn) upstream="$option" ;;
+		verbose) verbose=1 ;;
+		legacy)  legacy=1  ;;
+		name)    name=1 ;;
+		esac
+	done
+
+	# Find our upstream
+	case "$upstream" in
+	git)    upstream="@{upstream}" ;;
+	svn*)
+		# get the upstream from the "git-svn-id: ..." in a commit message
+		# (git-svn uses essentially the same procedure internally)
+		local -a svn_upstream
+		svn_upstream=($(git log --first-parent -1 \
+					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
+		if [[ 0 -ne ${#svn_upstream[@]} ]]; then
+			svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
+			svn_upstream=${svn_upstream%@*}
+			local n_stop="${#svn_remote[@]}"
+			for ((n=1; n <= n_stop; n++)); do
+				svn_upstream=${svn_upstream#${svn_remote[$n]}}
+			done
+
+			if [[ -z "$svn_upstream" ]]; then
+				# default branch name for checkouts with no layout:
+				upstream=${GIT_SVN_ID:-git-svn}
+			else
+				upstream=${svn_upstream#/}
+			fi
+		elif [[ "svn+git" = "$upstream" ]]; then
+			upstream="@{upstream}"
+		fi
+		;;
+	esac
+
+	# Find how many commits we are ahead/behind our upstream
+	if [[ -z "$legacy" ]]; then
+		count="$(git rev-list --count --left-right \
+				"$upstream"...HEAD 2>/dev/null)"
+	else
+		# produce equivalent output to --count for older versions of git
+		local commits
+		if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
+		then
+			local commit behind=0 ahead=0
+			for commit in $commits
+			do
+				case "$commit" in
+				"<"*) ((behind++)) ;;
+				*)    ((ahead++))  ;;
+				esac
+			done
+			count="$behind	$ahead"
+		else
+			count=""
+		fi
+	fi
+
+	# calculate the result
+	if [[ -z "$verbose" ]]; then
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p="=" ;;
+		"0	"*) # ahead of upstream
+			p=">" ;;
+		*"	0") # behind upstream
+			p="<" ;;
+		*)	    # diverged from upstream
+			p="<>" ;;
+		esac
+	else
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p=" u=" ;;
+		"0	"*) # ahead of upstream
+			p=" u+${count#0	}" ;;
+		*"	0") # behind upstream
+			p=" u-${count%	0}" ;;
+		*)	    # diverged from upstream
+			p=" u+${count#*	}-${count%	*}" ;;
+		esac
+		if [[ -n "$count" && -n "$name" ]]; then
+			__git_ps1_upstream_name=$(git rev-parse \
+				--abbrev-ref "$upstream" 2>/dev/null)
+			if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+				p="$p \${__git_ps1_upstream_name}"
+			else
+				p="$p ${__git_ps1_upstream_name}"
+				# not needed anymore; keep user's
+				# environment clean
+				unset __git_ps1_upstream_name
+			fi
+		fi
+	fi
+
+}
+
+# Helper function that is meant to be called from __git_ps1.  It
+# injects color codes into the appropriate gitstring variables used
+# to build a gitstring.
+__git_ps1_colorize_gitstring ()
+{
+	if [[ -n ${ZSH_VERSION-} ]]; then
+		local c_red='%F{red}'
+		local c_green='%F{green}'
+		local c_lblue='%F{blue}'
+		local c_clear='%f'
+	else
+		# Using \[ and \] around colors is necessary to prevent
+		# issues with command line editing/browsing/completion!
+		local c_red='\[\e[31m\]'
+		local c_green='\[\e[32m\]'
+		local c_lblue='\[\e[1;34m\]'
+		local c_clear='\[\e[0m\]'
+	fi
+	local bad_color=$c_red
+	local ok_color=$c_green
+	local flags_color="$c_lblue"
+
+	local branch_color=""
+	if [ $detached = no ]; then
+		branch_color="$ok_color"
+	else
+		branch_color="$bad_color"
+	fi
+	c="$branch_color$c"
+
+	z="$c_clear$z"
+	if [ "$w" = "*" ]; then
+		w="$bad_color$w"
+	fi
+	if [ -n "$i" ]; then
+		i="$ok_color$i"
+	fi
+	if [ -n "$s" ]; then
+		s="$flags_color$s"
+	fi
+	if [ -n "$u" ]; then
+		u="$bad_color$u"
+	fi
+	r="$c_clear$r"
+}
+
+__git_eread ()
+{
+	local f="$1"
+	shift
+	test -r "$f" && read "$@" <"$f"
+}
+
+# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
+# when called from PS1 using command substitution
+# in this mode it prints text to add to bash PS1 prompt (includes branch name)
+#
+# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
+# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
+# when two arguments are given, the first is prepended and the second appended
+# to the state string when assigned to PS1.
+# The optional third parameter will be used as printf format string to further
+# customize the output of the git-status string.
+# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
+__git_ps1 ()
+{
+	# preserve exit status
+	local exit=$?
+	local pcmode=no
+	local detached=no
+	local ps1pc_start='\u@\h:\w '
+	local ps1pc_end='\$ '
+	local printf_format=' (%s)'
+
+	case "$#" in
+		2|3)	pcmode=yes
+			ps1pc_start="$1"
+			ps1pc_end="$2"
+			printf_format="${3:-$printf_format}"
+			# set PS1 to a plain prompt so that we can
+			# simply return early if the prompt should not
+			# be decorated
+			PS1="$ps1pc_start$ps1pc_end"
+		;;
+		0|1)	printf_format="${1:-$printf_format}"
+		;;
+		*)	return $exit
+		;;
+	esac
+
+	# ps1_expanded:  This variable is set to 'yes' if the shell
+	# subjects the value of PS1 to parameter expansion:
+	#
+	#   * bash does unless the promptvars option is disabled
+	#   * zsh does not unless the PROMPT_SUBST option is set
+	#   * POSIX shells always do
+	#
+	# If the shell would expand the contents of PS1 when drawing
+	# the prompt, a raw ref name must not be included in PS1.
+	# This protects the user from arbitrary code execution via
+	# specially crafted ref names.  For example, a ref named
+	# 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
+	# shell to execute 'sudo rm -rf /' when the prompt is drawn.
+	#
+	# Instead, the ref name should be placed in a separate global
+	# variable (in the __git_ps1_* namespace to avoid colliding
+	# with the user's environment) and that variable should be
+	# referenced from PS1.  For example:
+	#
+	#     __git_ps1_foo=$(do_something_to_get_ref_name)
+	#     PS1="...stuff...\${__git_ps1_foo}...stuff..."
+	#
+	# If the shell does not expand the contents of PS1, the raw
+	# ref name must be included in PS1.
+	#
+	# The value of this variable is only relevant when in pcmode.
+	#
+	# Assume that the shell follows the POSIX specification and
+	# expands PS1 unless determined otherwise.  (This is more
+	# likely to be correct if the user has a non-bash, non-zsh
+	# shell and safer than the alternative if the assumption is
+	# incorrect.)
+	#
+	local ps1_expanded=yes
+	[ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+	[ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
+
+	local repo_info rev_parse_exit_code
+	repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
+		--is-bare-repository --is-inside-work-tree \
+		--short HEAD 2>/dev/null)"
+	rev_parse_exit_code="$?"
+
+	if [ -z "$repo_info" ]; then
+		return $exit
+	fi
+
+	local short_sha
+	if [ "$rev_parse_exit_code" = "0" ]; then
+		short_sha="${repo_info##*$'\n'}"
+		repo_info="${repo_info%$'\n'*}"
+	fi
+	local inside_worktree="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local bare_repo="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local inside_gitdir="${repo_info##*$'\n'}"
+	local g="${repo_info%$'\n'*}"
+
+	if [ "true" = "$inside_worktree" ] &&
+	   [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &&
+	   [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &&
+	   git check-ignore -q .
+	then
+		return $exit
+	fi
+
+	local r=""
+	local b=""
+	local step=""
+	local total=""
+	if [ -d "$g/rebase-merge" ]; then
+		__git_eread "$g/rebase-merge/head-name" b
+		__git_eread "$g/rebase-merge/msgnum" step
+		__git_eread "$g/rebase-merge/end" total
+		if [ -f "$g/rebase-merge/interactive" ]; then
+			r="|REBASE-i"
+		else
+			r="|REBASE-m"
+		fi
+	else
+		if [ -d "$g/rebase-apply" ]; then
+			__git_eread "$g/rebase-apply/next" step
+			__git_eread "$g/rebase-apply/last" total
+			if [ -f "$g/rebase-apply/rebasing" ]; then
+				__git_eread "$g/rebase-apply/head-name" b
+				r="|REBASE"
+			elif [ -f "$g/rebase-apply/applying" ]; then
+				r="|AM"
+			else
+				r="|AM/REBASE"
+			fi
+		elif [ -f "$g/MERGE_HEAD" ]; then
+			r="|MERGING"
+		elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
+			r="|CHERRY-PICKING"
+		elif [ -f "$g/REVERT_HEAD" ]; then
+			r="|REVERTING"
+		elif [ -f "$g/BISECT_LOG" ]; then
+			r="|BISECTING"
+		fi
+
+		if [ -n "$b" ]; then
+			:
+		elif [ -h "$g/HEAD" ]; then
+			# symlink symbolic ref
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			local head=""
+			if ! __git_eread "$g/HEAD" head; then
+				return $exit
+			fi
+			# is it a symbolic ref?
+			b="${head#ref: }"
+			if [ "$head" = "$b" ]; then
+				detached=yes
+				b="$(
+				case "${GIT_PS1_DESCRIBE_STYLE-}" in
+				(contains)
+					git describe --contains HEAD ;;
+				(branch)
+					git describe --contains --all HEAD ;;
+				(describe)
+					git describe HEAD ;;
+				(* | default)
+					git describe --tags --exact-match HEAD ;;
+				esac 2>/dev/null)" ||
+
+				b="$short_sha..."
+				b="($b)"
+			fi
+		fi
+	fi
+
+	if [ -n "$step" ] && [ -n "$total" ]; then
+		r="$r $step/$total"
+	fi
+
+	local w=""
+	local i=""
+	local s=""
+	local u=""
+	local c=""
+	local p=""
+
+	if [ "true" = "$inside_gitdir" ]; then
+		if [ "true" = "$bare_repo" ]; then
+			c="BARE:"
+		else
+			b="GIT_DIR!"
+		fi
+	elif [ "true" = "$inside_worktree" ]; then
+		if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
+		   [ "$(git config --bool bash.showDirtyState)" != "false" ]
+		then
+			git diff --no-ext-diff --quiet --exit-code || w="*"
+			if [ -n "$short_sha" ]; then
+				git diff-index --cached --quiet HEAD -- || i="+"
+			else
+				i="#"
+			fi
+		fi
+		if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
+		   git rev-parse --verify --quiet refs/stash >/dev/null
+		then
+			s="$"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
+		   [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
+		   git ls-files --others --exclude-standard --error-unmatch -- ':/*' >/dev/null 2>/dev/null
+		then
+			u="%${ZSH_VERSION+%}"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+			__git_ps1_show_upstream
+		fi
+	fi
+
+	local z="${GIT_PS1_STATESEPARATOR-" "}"
+
+	# NO color option unless in PROMPT_COMMAND mode
+	if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
+		__git_ps1_colorize_gitstring
+	fi
+
+	b=${b##refs/heads/}
+	if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+		__git_ps1_branch_name=$b
+		b="\${__git_ps1_branch_name}"
+	fi
+
+	local f="$w$i$s$u"
+	local gitstring="$c$b${f:+$z$f}$r$p"
+
+	if [ $pcmode = yes ]; then
+		if [ "${__git_printf_supports_v-}" != yes ]; then
+			gitstring=$(printf -- "$printf_format" "$gitstring")
+		else
+			printf -v gitstring -- "$printf_format" "$gitstring"
+		fi
+		PS1="$ps1pc_start$gitstring$ps1pc_end"
+	else
+		printf -- "$printf_format" "$gitstring"
+	fi
+
+	return $exit
+}
diff --git a/src/scripts/hide-all.sh b/src/scripts/hide-all.sh
new file mode 100644
index 0000000..7d9d4f5
--- /dev/null
+++ b/src/scripts/hide-all.sh
@@ -0,0 +1,5 @@
+function hide-all() {
+	defaults write com.apple.finder AppleShowAllFiles FALSE
+
+	killall Finder
+}
diff --git a/src/scripts/launch-editors.sh b/src/scripts/launch-editors.sh
new file mode 100644
index 0000000..f5ee002
--- /dev/null
+++ b/src/scripts/launch-editors.sh
@@ -0,0 +1,27 @@
+function launch-code() {
+    if [[ $# = 0 ]]; then
+        echo "Open Visual Studio Code"
+        open -n -a "Visual Studio Code"
+    else [[ $1 = /* ]] && F="$1" || F="$PWD/${1#./}"
+        echo "Opening Visual Studio Code at: $F"
+	open -n -a "Visual Studio Code" --args "$F"
+    fi
+}
+
+function launch-sublime() {
+    if [[ $# = 0 ]]; then
+        echo "Opening Sublime Text"
+        open -n -a "Sublime Text"
+    else [[ $1 = /* ]] && F="$1" || F="$PWD/${1#./}"
+        echo "Opening Sublime Text at: $F"
+        open -n -a "Sublime Text" --args "$F"
+    fi
+}
+
+function code() {
+	launch-code $@
+}
+
+function sublime() {
+	launch-sublime $@
+}
diff --git a/src/scripts/list-directory.sh b/src/scripts/list-directory.sh
new file mode 100644
index 0000000..d4e9670
--- /dev/null
+++ b/src/scripts/list-directory.sh
@@ -0,0 +1,15 @@
+function la() {
+	ls -la $@
+}
+
+function ll() {
+	ls -lh $@
+}
+
+function lla() {
+	ls -lha $@
+}
+
+function lp() {
+	ls -p $@
+}
\ No newline at end of file
diff --git a/src/scripts/play-login.sh b/src/scripts/play-login.sh
new file mode 100644
index 0000000..f68d287
--- /dev/null
+++ b/src/scripts/play-login.sh
@@ -0,0 +1,9 @@
+function play-login() {
+	if [[ -f ~/.ssh/sounds/login.mp3 ]]; then
+		afplay ~/.ssh/sounds/login.mp3
+	fi
+}
+
+function logi() {
+	play-login
+}
\ No newline at end of file
diff --git a/src/scripts/remove-bookmark.sh b/src/scripts/remove-bookmark.sh
new file mode 100644
index 0000000..3002ce1
--- /dev/null
+++ b/src/scripts/remove-bookmark.sh
@@ -0,0 +1,34 @@
+remove-bookmark() {
+	local b=$1
+	local r=
+
+	# check to see if a bookmark was specified, otherwise use current directory to remove the bookmark
+	# using expanded if statement since the compact form seems to declare local variables of its own, even if the variable is declared
+	# in a wider scope (local to the main function or even global)
+	if [ ! -z $b ]; then
+		r=`command grep -s -m 1 ^$b ~/.ssh/scripts/bookmarks.sh`
+	elif [ -z $2 ]; then
+		r=`command grep -s -m 1 \"$PWD\"$ ~/.ssh/scripts/bookmarks.sh`
+	fi
+
+	# using (! -z) instead of (-n) due to a bug (or a lack of understanding)  where (-n) tests when a variable contains nothing
+	# after firing off the above command. Not sure how BASH handles null characters, if that is indeed what is being stored in $r.
+	if [ ! -z $r ]; then
+		[ -z $2 ] && ( echo Removing bookmark: $r )
+
+		command grep -s -v $r ~/.ssh/scripts/bookmarks.sh >> ~/.ssh/scripts/bookmarks1.sh
+		mv -f ~/.ssh/scripts/bookmarks1.sh ~/.ssh/scripts/bookmarks.sh
+
+		source ~/.ssh/scripts/bookmarks.sh
+	else
+		[ -z $2 ] && ( echo No bookmark was declared for the specified title or address. )
+	fi
+}
+
+function rbm() {
+	remove-bookmark $@
+}
+
+function rb() {
+	remove-bookmark $@
+}
\ No newline at end of file
diff --git a/src/scripts/remove-directory.sh b/src/scripts/remove-directory.sh
new file mode 100644
index 0000000..d67f084
--- /dev/null
+++ b/src/scripts/remove-directory.sh
@@ -0,0 +1,3 @@
+function rd() {
+	rm -dRr $@
+}
\ No newline at end of file
diff --git a/src/scripts/set-prompt.sh b/src/scripts/set-prompt.sh
new file mode 100644
index 0000000..6ed02e0
--- /dev/null
+++ b/src/scripts/set-prompt.sh
@@ -0,0 +1,31 @@
+# make sure that git prompt is sourced first
+source ~/.ssh/scripts/git-prompt.sh
+
+function set-prompt() {
+	# set the window title
+	echo -ne "\033]0;${USER}@${HOSTNAME%%.*} ${PWD}\007"
+	
+	# set the default color
+	local CLR_PROMPT=$CLR_USER_PROMPT
+	
+	# set color for root user
+	if [ `whoami` == 'root' ]; then
+		CLR_PROMPT=$CLR_ROOT_PROMPT
+	fi
+	
+	# set color for staff user (administrator)
+	if [ ! -z '`command id -Gn | grep -s -o admin`' ]; then
+	   CLR_PROMPT=$CLR_STAFF_PROMPT
+	fi
+
+	# specify the two-line prompt with color-coded arrow
+	export PS1="\n\u@\h : \w\n  $(__git_ps1 '(%s)')\[${CLR_PROMPT}\] ==> \[${CLR_CLEAR}\]"
+}
+
+GIT_PS1_SHOWDIRTYSTATE=true
+GIT_PS1_SHOWSTASHSTATE=true
+GIT_PS1_SHOWUNTRACKEDFILES=true
+GIT_PS1_SHOWUPSTREAM="verbose"
+
+# export the prompt command
+export PROMPT_COMMAND=set-prompt
\ No newline at end of file
diff --git a/src/scripts/show-all.sh b/src/scripts/show-all.sh
new file mode 100644
index 0000000..92be321
--- /dev/null
+++ b/src/scripts/show-all.sh
@@ -0,0 +1,4 @@
+function show-all() {
+	defaults write com.apple.finder AppleShowAllFiles TRUE
+	killall Finder
+}
diff --git a/src/scripts/show-boomarks.sh b/src/scripts/show-boomarks.sh
new file mode 100644
index 0000000..fb9a016
--- /dev/null
+++ b/src/scripts/show-boomarks.sh
@@ -0,0 +1,11 @@
+function show-bookmarks() {
+	cat ~/.ssh/scripts/bookmarks.sh
+}
+
+function show() {
+	show-bookmarks
+}
+
+function lb() {
+	show-bookmarks
+}
\ No newline at end of file
diff --git a/src/scripts/show-colors.sh b/src/scripts/show-colors.sh
new file mode 100644
index 0000000..ac600da
--- /dev/null
+++ b/src/scripts/show-colors.sh
@@ -0,0 +1,11 @@
+function show-colors() {
+	set | egrep 'CLR_w*'
+}
+
+function colors() {
+	show-colors
+}
+
+function lc() {
+	show-colors
+}
\ No newline at end of file
diff --git a/src/scripts/show-history.sh b/src/scripts/show-history.sh
new file mode 100644
index 0000000..9c4e0de
--- /dev/null
+++ b/src/scripts/show-history.sh
@@ -0,0 +1,7 @@
+function show-history() {
+	history $@
+}
+
+function lh() {
+	history $@
+}
\ No newline at end of file
diff --git a/src/scripts/themes.sh b/src/scripts/themes.sh
new file mode 100644
index 0000000..04933bc
--- /dev/null
+++ b/src/scripts/themes.sh
@@ -0,0 +1,4 @@
+function themes()
+{
+    open -a "Terminal" --args ~/.ssh/themes/terminal/Monokai.terminal
+}
diff --git a/src/sounds/login.mp3 b/src/sounds/login.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..a7f1578ffe7710918039dd0498f2b7929a420626
GIT binary patch
literal 41673
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
YNsWnhC8)q<{XQX})_Ga&h2kOxBCN
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

literal 0
HcmV?d00001

diff --git a/src/themes/terminal/Monokai.terminal b/src/themes/terminal/Monokai.terminal
new file mode 100644
index 0000000..0bb8b8e
--- /dev/null
+++ b/src/themes/terminal/Monokai.terminal
@@ -0,0 +1,245 @@
+
+
+
+
+	ANSIBlackColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NGMCAw
+	IDAAEAGAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVj
+	dF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltiaWttcn2GjpGa
+	rK+0AAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAALY=
+	
+	ANSIBlueColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBEw
+	IDAgMC42MzUyOTQxMTc2ABABgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29s
+	b3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztB
+	SE5bYnZ4en+Kk5uep7m8wQAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAADD
+	
+	ANSIBrightBlackColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw
+	LjM4MDM5MjE1NjkgMC4zNjg2Mjc0NTEgMC4yOTQxMTc2NDcxABABgALSEBESE1okY2xh
+	c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2
+	ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA
+	ABkAAAAAAAAAAAAAAAAAAADY
+	
+	ANSIBrightBlueColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBEw
+	IDAgMC45OTYwNzg0MzE0ABABgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29s
+	b3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztB
+	SE5bYnZ4en+Kk5uep7m8wQAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAADD
+	
+	ANSIBrightCyanColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	LjQwMDAwMDAzNTggMC44NTA5ODA0NjA2IDAuOTM3MjU0OTY1MwAQAoAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSIBrightGreenColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	LjYxOTYwNzg2NTggMC44ODYyNzQ1NzYyIDAuMTc2NDcwNTkyNgAQAoAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSIBrightMagentaColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBww
+	LjY4MjM1Mjk2MDEgMC41MDU4ODIzODI0IDEAEAKAAtIQERITWiRjbGFzc25hbWVYJGNs
+	YXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290
+	gAEIERojLTI3O0FITltigYOFipWepqmyxMfMAAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAA
+	AAAAAAAAAM4=
+	
+	ANSIBrightRedColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	Ljk3NjQ3MDY0OTIgMC4xNTI5NDExODIzIDAuNDM1Mjk0MTUxMwAQAoAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSIBrightYellowColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	Ljg4NjI3NDU3NjIgMC44NTg4MjM1OTc0IDAuNDU0OTAxOTkzMwAQAoAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSICyanColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	LjIxNjIwNjQyNjEgMC41NzAzMzY5MjU4IDAuNjQ3MDY1MDMzOAAQAYAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSIGreenColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECgw
+	LjM3NTg2NDc2ODMgMC42MDM1NDcyOTczIDAuMDM0MTI3MzAxMDMAEAGAAtIQERITWiRj
+	bGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNo
+	aXZlctEXGFRyb290gAEIERojLTI3O0FITltijY+RlqGqsrW+0NPYAAAAAAAAAQEAAAAA
+	AAAAGQAAAAAAAAAAAAAAAAAAANo=
+	
+	ANSIMagentaColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	LjM4OTUyMDEzNTQgMC4yNDIzMDcxNzA3IDAuNjQzMjQzMjQzMgAQAYAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	ANSIRedColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBww
+	LjU0MDIyMzgxNzYgMCAwLjE5Mzk0OTEzNzQAEAGAAtIQERITWiRjbGFzc25hbWVYJGNs
+	YXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290
+	gAEIERojLTI3O0FITltigYOFipWepqmyxMfMAAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAA
+	AAAAAAAAAM4=
+	
+	ANSIYellowColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
+	LjYwNTcyMjEyODQgMC41ODc3NDIyNzg0IDAuMjQ4OTYzNDQ3MwAQAYAC0hAREhNaJGNs
+	YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
+	dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
+	AAAZAAAAAAAAAAAAAAAAAAAA2Q==
+	
+	BackgroundColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECsw
+	LjE1Mjk0MTE4MjMgMC4xNTY4NjI3NTA2IDAuMTMzMzMzMzQwMyAwLjgAEAKAAtIQERIT
+	WiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRB
+	cmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltikJKUmaSttbjB09bbAAAAAAAAAQEA
+	AAAAAAAAGQAAAAAAAAAAAAAAAAAAAN0=
+	
+	CursorBlink
+	
+	CursorColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NGMSAx
+	IDEAEAGAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVj
+	dF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltiaWttcn2GjpGa
+	rK+0AAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAALY=
+	
+	CursorType
+	2
+	Font
+	
+	YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs
+	YXNzI0AoAAAAAAAAEBCAAoADXU1lbmxvLVJlZ3VsYXLSExQVFlokY2xhc3NuYW1lWCRj
+	bGFzc2VzVk5TRm9udKIVF1hOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEaG1Ryb290
+	gAEIERojLTI3PEJLUltiaXJ0dniGi5afpqmyxMfMAAAAAAAAAQEAAAAAAAAAHAAAAAAA
+	AAAAAAAAAAAAAM4=
+	
+	FontAntialias
+	
+	Linewrap
+	
+	ProfileCurrentVersion
+	2.04
+	SelectionColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECgw
+	LjYxNTY4NjI3NDUgMC4zMzMzMzMzMzMzIDAuMDU4ODIzNTI5NDEAEAGAAtIQERITWiRj
+	bGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNo
+	aXZlctEXGFRyb290gAEIERojLTI3O0FITltijY+RlqGqsrW+0NPYAAAAAAAAAQEAAAAA
+	AAAAGQAAAAAAAAAAAAAAAAAAANo=
+	
+	ShowActiveProcessInTitle
+	
+	ShowCommandKeyInTitle
+	
+	ShowComponentsWhenTabHasCustomTitle
+	
+	ShowDimensionsInTitle
+	
+	ShowRepresentedURLPathInTitle
+	
+	ShowShellCommandInTitle
+	
+	ShowTTYNameInTitle
+	
+	ShowWindowSettingsNameInTitle
+	
+	TextBoldColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0Ix
+	ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3Rf
+	EA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZGdpa3B7hIyPmKqt
+	sgAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0
+	
+	TextColor
+	
+	YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
+	AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0Ix
+	ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3Rf
+	EA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZGdpa3B7hIyPmKqt
+	sgAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0
+	
+	UseBrightBold
+	
+	WindowTitle
+	Terminal
+	columnCount
+	150
+	name
+	Monokai
+	noWarnProcesses
+	
+		
+			ProcessName
+			rlogin
+		
+		
+			ProcessName
+			telnet
+		
+		
+			ProcessName
+			ssh
+		
+		
+			ProcessName
+			slogin
+		
+		
+			ProcessName
+			screen
+		
+		
+			ProcessName
+			tmux
+		
+	
+	rowCount
+	50
+	type
+	Window Settings
+
+
diff --git a/template b/template
new file mode 100644
index 0000000..e013ec0
--- /dev/null
+++ b/template
@@ -0,0 +1,3 @@
+if [ -f ~/.ssh/bashrc ]; then
+    . ~/.ssh/bashrc
+fi