forked from cowboy/dotfiles
-
Notifications
You must be signed in to change notification settings - Fork 2
/
50_prompt.sh
143 lines (129 loc) · 4.07 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
# 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
# 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_getcolors='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_exitcode() {
prompt_getcolors
[[ $1 != 0 ]] && echo " $c2$1$c9"
}
# Git status.
function prompt_git() {
prompt_getcolors
local status output flags branch
status="$(git status 2>/dev/null)"
[[ $? != 0 ]] && return;
output="$(echo "$status" | awk '/# Initial commit/ {print "(init)"}')"
[[ "$output" ]] || output="$(echo "$status" | awk '/# On branch/ {print $4}')"
[[ "$output" ]] || output="$(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}'
)"
if [[ "$flags" ]]; then
output="$output$c1:$c0$flags"
fi
echo "$c1[$c0$output$c1]$c9"
}
# hg status.
function prompt_hg() {
prompt_getcolors
local summary output bookmark flags
summary="$(hg summary 2>/dev/null)"
[[ $? != 0 ]] && return;
output="$(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}'
)"
output="$output:$bookmark"
if [[ "$flags" ]]; then
output="$output$c1:$c0$flags"
fi
echo "$c1[$c0$output$c1]$c9"
}
# SVN info.
function prompt_svn() {
prompt_getcolors
local info="$(svn info . 2> /dev/null)"
local last current
if [[ "$info" ]]; then
last="$(echo "$info" | awk '/Last Changed Rev:/ {print $4}')"
current="$(echo "$info" | awk '/Revision:/ {print $2}')"
echo "$c1[$c0$last$c1:$c0$current$c1]$c9"
fi
}
# Maintain a per-execution call stack.
prompt_stack=()
trap 'prompt_stack=("${prompt_stack[@]}" "$BASH_COMMAND")' DEBUG
function prompt_command() {
local 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_getcolors
# http://twitter.com/cowboy/status/150254030654939137
PS1="\n"
# svn: [repo:lastchanged]
PS1="$PS1$(prompt_svn)"
# git: [branch:flags]
PS1="$PS1$(prompt_git)"
# hg: [branch:flags]
PS1="$PS1$(prompt_hg)"
# 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_exitcode "$exit_code")"
PS1="$PS1 \$ "
}
PROMPT_COMMAND="prompt_command"