123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- #!/usr/bin/env bash
- #
- # Opt-in for custom prompt through by setting:
- # rvm_ps1=1
- # in either /etc/rvmrc or $HOME/.rvmrc
- #
- # Then in order to set your prompt you simply do the following for example
- #
- # Examples:
- #
- # ps1_set --prompt ∫
- #
- # or
- #
- # ps1_set --prompt ∴
- #
- # This will yield a prompt like the following, for example,
- #
- # 00:00:50 wayneeseguin@GeniusAir:~/projects/db0/rvm/rvm (git:master:156d0b4) ruby-1.8.7-p334@rvm
- # ∴
- #
- ps1_titlebar()
- {
- case $TERM in
- (xterm*|rxvt*)
- printf "%s" "\033]0;\\u@\\h: \W\\007"
- ;;
- esac
- }
- ps1_identity()
- {
- if (( $UID == 0 )) ; then
- printf "%s" "\[\033[31m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
- else
- printf "%s" "\[\033[32m\]\\u\[\033[0m\]@\[\033[36m\]\\h\[\033[35m\]:\w\[\033[0m\] "
- fi
- }
- ps1_git()
- {
- local branch="" sha1="" line="" attr="" color=0
- shopt -s extglob # Important, for our nice matchers :)
- command -v git >/dev/null 2>&1 || {
- printf " \033[1;37m\033[41m[git not found]\033[m "
- return 0
- }
- branch=$(git symbolic-ref -q HEAD 2>/dev/null) || return 0 # Not in git repo.
- branch=${branch##refs/heads/}
- # Now we display the branch.
- sha1=$(git rev-parse --short --quiet HEAD)
- case "${branch:-"(no branch)"}" in
- production|prod) attr="1;37m\033[" ; color=41 ;; # red
- master|deploy) color=31 ;; # red
- stage|staging) color=33 ;; # yellow
- dev|develop|development) color=34 ;; # blue
- next) color=36 ;; # gray
- *)
- if [[ -n "${branch}" ]] ; then # Feature Branch :)
- color=32 # green
- else
- color=0 # reset
- fi
- ;;
- esac
- [[ $color -gt 0 ]] &&
- printf "\[\033[${attr}${color}m\](git:${branch}$(ps1_git_status):$sha1)\[\033[0m\] "
- }
- ps1_git_status()
- {
- local git_status="$(git status 2>/dev/null)"
- [[ "${git_status}" = *deleted* ]] && printf "%s" "-"
- [[ "${git_status}" = *Untracked[[:space:]]files:* ]] && printf "%s" "+"
- [[ "${git_status}" = *modified:* ]] && printf "%s" "*"
- }
- ps1_rvm()
- {
- command -v rvm-prompt >/dev/null 2>&1 && printf "%s" " $(rvm-prompt) "
- }
- ps1_update()
- {
- local prompt_char='$' separator="\n" notime=0
- (( $UID == 0 )) && prompt_char='#'
- while [[ $# -gt 0 ]] ; do
- local token="$1" ; shift
- case "$token" in
- --trace)
- export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()} \${LINENO} > "
- set -o xtrace
- ;;
- --prompt)
- prompt_char="$1"
- shift
- ;;
- --noseparator)
- separator=""
- ;;
- --separator)
- separator="$1"
- shift
- ;;
- --notime)
- notime=1
- ;;
- *)
- true # Ignore everything else.
- ;;
- esac
- done
- if (( notime > 0 )) ; then
- PS1="$(ps1_titlebar)$(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
- else
- PS1="$(ps1_titlebar)\D{%H:%M:%S} $(ps1_identity)$(ps1_git)$(ps1_rvm)${separator}${prompt_char} "
- fi
- }
- ps2_set()
- {
- PS2=" \[\033[0;40m\]\[\033[0;33m\]> \[\033[1;37m\]\[\033[1m\]"
- }
- ps4_set()
- {
- export PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()} \${LINENO} > "
- }
- # WARNING: This clobbers your PROMPT_COMMAND so if you need to write your own, call
- # ps1_update within your PROMPT_COMMAND with the same arguments you pass
- # to ps1_set
- #
- # The PROMPT_COMMAND is used to help the prompt work if the separator is not a new line.
- # In the event that the separator is not a new line, the prompt line may become distorted if
- # you add or delete a certian number of characters, making the string wider than the
- # $COLUMNS + len(your_input_line).
- #
- # This orginally was done with callbacks within the PS1 to add in things like the git
- # commit, but this results in the PS1 being of an unknown width which results in the prompt
- # being distorted if you add or remove a certain number of characters. To work around this
- # it now uses the PROMPT_COMMAND callback to re-set the PS1 with a known width of chracters
- # each time a new command is entered. See PROMPT_COMMAND for more details.
- #
- ps1_set()
- {
- PROMPT_COMMAND="ps1_update $@"
- }
|