forked from cowboy/dotfiles
-
Notifications
You must be signed in to change notification settings - Fork 0
/
50_prompt.sh
153 lines (138 loc) · 4.63 KB
/
50_prompt.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# My awesome bash prompt
#
# Copyright (c) 2012 "Cowboy" Ben Alman
# Licensed under the MIT license.
# http://benalman.com/about/license/
#
# Example:
# [master:!?][cowboy@CowBook:~/.dotfiles]
# [11:14:45] $
#
# Read more (and see a screenshot) in the "Prompt" section of
# https://github.com/cowboy/dotfiles
# Abort if a prompt is already defined.
[[ "$PROMPT_COMMAND" ]] && return
# ANSI CODES - SEPARATE MULTIPLE VALUES WITH ;
#
# 0 reset 4 underline
# 1 bold 7 inverse
#
# FG BG COLOR FG BG COLOR
# 30 40 black 34 44 blue
# 31 41 red 35 45 magenta
# 32 42 green 36 46 cyan
# 33 43 yellow 37 47 white
if [[ ! "${__prompt_colors[@]}" ]]; then
__prompt_colors=(
"36" # information color
"37" # bracket color
"31" # error color
)
if [[ "$SSH_TTY" ]]; then
# connected via ssh
__prompt_colors[0]="32"
elif [[ "$USER" == "root" ]]; then
# logged in as root
__prompt_colors[0]="35"
fi
fi
# Inside a prompt function, run this alias to setup local $c0-$c9 color vars.
alias __prompt_get_colors='__prompt_colors[9]=; local i; for i in ${!__prompt_colors[@]}; do local c$i="\[\e[0;${__prompt_colors[$i]}m\]"; done'
# Exit code of previous command.
function __prompt_exit_code() {
__prompt_get_colors
[[ $1 != 0 ]] && echo " $c2$1$c9"
}
# Git status.
function __prompt_git() {
__prompt_get_colors
local status branch flags
status="$(git status 2>/dev/null)"
[[ $? != 0 ]] && return 1;
branch="$(echo "$status" | awk '/# Initial commit/ {print "(init)"}')"
[[ "$branch" ]] || branch="$(echo "$status" | awk '/# On branch/ {print $4}')"
[[ "$branch" ]] || branch="$(git branch | perl -ne '/^\* \(detached from (.*)\)$/ ? print "($1)" : /^\* (.*)/ && print $1')"
flags="$(
echo "$status" | awk 'BEGIN {r=""} \
/^(# )?Changes to be committed:$/ {r=r "+"}\
/^(# )?Changes not staged for commit:$/ {r=r "!"}\
/^(# )?Untracked files:$/ {r=r "?"}\
END {print r}'
)"
__prompt_vcs_info=("$branch" "$flags")
}
# hg status.
function __prompt_hg() {
__prompt_get_colors
local summary branch bookmark flags
summary="$(hg summary 2>/dev/null)"
[[ $? != 0 ]] && return 1;
branch="$(echo "$summary" | awk '/branch:/ {print $2}')"
bookmark="$(echo "$summary" | awk '/bookmarks:/ {print $2}')"
flags="$(
echo "$summary" | awk 'BEGIN {r="";a=""} \
/(modified)/ {r= "+"}\
/(unknown)/ {a= "?"}\
END {print r a}'
)"
__prompt_vcs_info=("$branch" "$bookmark" "$flags")
}
# SVN info.
function __prompt_svn() {
__prompt_get_colors
local info last current
info="$(svn info . 2> /dev/null)"
[[ ! "$info" ]] && return 1
last="$(echo "$info" | awk '/Last Changed Rev:/ {print $4}')"
current="$(echo "$info" | awk '/Revision:/ {print $2}')"
__prompt_vcs_info=("$last" "$current")
}
# Maintain a per-execution call stack.
__prompt_stack=()
trap '__prompt_stack=("${__prompt_stack[@]}" "$BASH_COMMAND")' DEBUG
function __prompt_command() {
local i exit_code=$?
# If the first command in the stack is __prompt_command, no command was run.
# Set exit_code to 0 and reset the stack.
[[ "${__prompt_stack[0]}" == "__prompt_command" ]] && exit_code=0
__prompt_stack=()
# Manually load z here, after $? is checked, to keep $? from being clobbered.
[[ "$(type -t _z)" ]] && _z --add "$(pwd -P 2>/dev/null)" 2>/dev/null
# While the simple_prompt environment var is set, disable the awesome prompt.
[[ "$simple_prompt" ]] && PS1='\n$ ' && return
__prompt_get_colors
# http://twitter.com/cowboy/status/150254030654939137
PS1="\n"
__prompt_vcs_info=()
# git: [branch:flags]
__prompt_git || \
# hg: [branch:bookmark:flags]
__prompt_hg || \
# svn: [repo:lastchanged]
__prompt_svn
# Iterate over all vcs info parts, outputting an escaped var name that will
# be interpolated automatically. This ensures that malicious branch names
# can't execute arbitrary commands. For more info, see this PR:
# https://github.com/cowboy/dotfiles/pull/68
if [[ "${#__prompt_vcs_info[@]}" != 0 ]]; then
PS1="$PS1$c1[$c0"
for i in "${!__prompt_vcs_info[@]}"; do
if [[ "${__prompt_vcs_info[i]}" ]]; then
[[ $i != 0 ]] && PS1="$PS1$c1:$c0"
PS1="$PS1\${__prompt_vcs_info[$i]}"
fi
done
PS1="$PS1$c1]$c9"
fi
# misc: [cmd#:hist#]
# PS1="$PS1$c1[$c0#\#$c1:$c0!\!$c1]$c9"
# path: [user@host:path]
PS1="$PS1$c1[$c0\u$c1@$c0\h$c1:$c0\w$c1]$c9"
PS1="$PS1\n"
# date: [HH:MM:SS]
PS1="$PS1$c1[$c0$(date +"%H$c1:$c0%M$c1:$c0%S")$c1]$c9"
# exit code: 127
PS1="$PS1$(__prompt_exit_code "$exit_code")"
PS1="$PS1 \$ "
}
PROMPT_COMMAND="__prompt_command"