-
-
Notifications
You must be signed in to change notification settings - Fork 64
/
bash_powerline
171 lines (140 loc) Β· 5.48 KB
/
bash_powerline
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/usr/bin/env bash
# Borrowed and customized from https://github.com/riobard/bash-powerline
__powerline() {
# Unicode symbols
readonly PS_SYMBOL_DARWIN='ο£Ώ'
# readonly PS_SYMBOL_LINUX='$'
readonly PS_SYMBOL_LINUX='π§ '
readonly PS_SYMBOL_OTHER='%'
readonly GIT_BRANCH_SYMBOL='β'
readonly GIT_BRANCH_CHANGED_SYMBOL='+'
readonly GIT_NEED_PUSH_SYMBOL='β‘'
readonly GIT_NEED_PULL_SYMBOL='β£'
readonly RUBY_SYMBOL='β¬'
readonly NODE_SYMBOL='β¬’'
function __tput { tput $* 2> /dev/null; }
# https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
readonly FG_BLACK="\[$(__tput setaf 0)\]"
readonly FG_WHITE="\[$(__tput setaf 7)\]"
readonly FG_DARK_GRAY="\[$(__tput setaf 8)\]"
readonly FG_GRAY="\[$(__tput setaf 15)\]"
readonly FG_RED="\[$(__tput setaf 1)\]"
readonly FG_GREEN="\[$(__tput setaf 2)\]"
readonly FG_YELLOW="\[$(__tput setaf 3)\]"
readonly FG_BLUE="\[$(__tput setaf 4)\]"
readonly FG_MAGENTA="\[$(__tput setaf 5)\]"
readonly FG_CYAN="\[$(__tput setaf 6)\]"
readonly FG_HIGH_RED="\[$(__tput setaf 9)\]"
readonly FG_HIGH_GREEN="\[$(__tput setaf 10)\]"
readonly FG_HIGH_YELLOW="\[$(__tput setaf 11)\]"
readonly FG_HIGH_BLUE="\[$(__tput setaf 12)\]"
readonly FG_HIGH_MAGENTA="\[$(__tput setaf 13)\]"
readonly FG_HIGH_CYAN="\[$(__tput setaf 14)\]"
readonly BG_BLACK="\[$(__tput setab 0)\]"
readonly BG_WHITE="\[$(__tput setab 7)\]"
readonly BG_DARK_GRAY="\[$(__tput setab 8)\]"
readonly BG_GRAY="\[$(__tput setab 15)\]"
readonly BG_RED="\[$(__tput setab 1)\]"
readonly BG_GREEN="\[$(__tput setab 2)\]"
readonly BG_YELLOW="\[$(__tput setab 3)\]"
readonly BG_BLUE="\[$(__tput setab 4)\]"
readonly BG_MAGENTA="\[$(__tput setab 5)\]"
readonly BG_CYAN="\[$(__tput setab 6)\]"
readonly BG_HIGH_RED="\[$(__tput setab 9)\]"
readonly BG_HIGH_GREEN="\[$(__tput setab 10)\]"
readonly BG_HIGH_YELLOW="\[$(__tput setab 11)\]"
readonly BG_HIGH_BLUE="\[$(__tput setab 12)\]"
readonly BG_HIGH_MAGENTA="\[$(__tput setab 13)\]"
readonly BG_HIGH_CYAN="\[$(__tput setab 14)\]"
readonly BG_DEEP_GREEN="\[$(__tput setab 22)\]"
readonly BG_DEEP_RED="\[$(__tput setab 88)\]"
readonly DIM="\[$(__tput dim)\]"
readonly REVERSE="\[$(__tput rev)\]"
readonly RESET="\[$(__tput sgr0)\]"
readonly BOLD="\[$(__tput bold)\]"
# what OS?
case "$(uname)" in
Darwin)
readonly PS_SYMBOL=$PS_SYMBOL_DARWIN
;;
Linux)
readonly PS_SYMBOL=$PS_SYMBOL_LINUX
;;
*)
readonly PS_SYMBOL=$PS_SYMBOL_OTHER
esac
### Ruby #######################################################
if [ `which rbenv 2> /dev/null` ]; then
__ruby_version() { printf $(rbenv version-name); }
elif [ `which ruby 2> /dev/null` ]; then
__ruby_version() { printf $(ruby --version | cut -d' ' -f2); }
else
__ruby_version() { return; }
fi
__ruby_info() {
local version=$(__ruby_version)
[ -z "${version}" ] && return
printf " $RUBY_SYMBOL ${version} "
}
### Node.js ####################################################
if [ `which nodenv 2> /dev/null` ]; then
__node_version() { printf $(nodenv version-name); }
elif [ `which node 2> /dev/null` ]; then
__node_version() { printf $(node -v | cut -d'v' -f2); }
else
__node_version() { return; }
fi
__node_info() {
local version=$(__node_version)
[ -z "${version}" ] && return
printf " $NODE_SYMBOL ${version} "
}
### Git ########################################################
__git_info() {
[ -x "$(which git)" ] || return # git not found
local git_eng="env LANG=C git" # force git output in English to make our work easier
# get current branch name or short SHA1 hash for detached head
local branch="$($git_eng symbolic-ref --short HEAD 2>/dev/null || $git_eng describe --tags --always 2>/dev/null)"
[ -n "$branch" ] || return # git branch not found
local marks
# branch is modified?
[ -n "$($git_eng status --porcelain)" ] && marks+=" $GIT_BRANCH_CHANGED_SYMBOL"
# how many commits local branch is ahead/behind of remote?
local stat="$($git_eng status --porcelain --branch | grep '^##' | grep -o '\[.\+\]$')"
local aheadN="$(echo $stat | grep -o 'ahead [[:digit:]]\+' | grep -o '[[:digit:]]\+')"
local behindN="$(echo $stat | grep -o 'behind [[:digit:]]\+' | grep -o '[[:digit:]]\+')"
[ -n "$aheadN" ] && marks+=" $GIT_NEED_PUSH_SYMBOL$aheadN"
[ -n "$behindN" ] && marks+=" $GIT_NEED_PULL_SYMBOL$behindN"
printf " $GIT_BRANCH_SYMBOL $branch$marks "
}
### PROMPT #####################################################
# __title_info() { echo -ne "${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}"; }
__title_info() { echo -ne "${PWD##*/} : ${USER}@${HOSTNAME%%.*}"; }
case $TERM in
xterm*|rxvt|Eterm|eterm)
title() { echo -ne "\033]2;$(__title_info)\007"; }
;;
screen)
title() { echo -ne "\033_$(__title_info)\033\\"; }
;;
esac
ps1() {
# Check the exit code of the previous command and display different
# colors in the prompt accordingly.
if [ $? -eq 0 ]; then
local BG_EXIT="$BG_DEEP_GREEN"
else
local BG_EXIT="$BG_DEEP_RED"
fi
PS1="\n$BG_DARK_GRAY$FG_GRAY \s $RESET"
PS1+="$BG_HIGH_YELLOW$FG_BLACK \w $RESET"
PS1+="$BG_HIGH_RED$FG_GRAY$(__ruby_info)$RESET"
PS1+="$BG_DEEP_GREEN$FG_GRAY$(__node_info)$RESET"
PS1+="$BG_HIGH_BLUE$FG_GRAY$(__git_info)$RESET\n"
PS1+="$BG_GRAY$FG_BLACK \u@\h $RESET"
PS1+="$BG_EXIT$FG_GRAY $PS_SYMBOL $RESET "
}
PROMPT_COMMAND="ps1 && title"
}
__powerline
unset __powerline