forked from riobard/bash-powerline
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbash-powerline.sh
More file actions
167 lines (145 loc) · 6.21 KB
/
bash-powerline.sh
File metadata and controls
167 lines (145 loc) · 6.21 KB
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
#!/usr/bin/env bash
__powerline() {
readonly DISABLE_GIT_STATUS=${DISABLE_GIT_STATUS:-''}
# Max length of full path
readonly MAX_PATH_LENGTH=${MAX_PATH_LENGTH:-30}
# Unicode symbols
readonly PS_SYMBOL_DARWIN=''
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='⇣'
# Solarized colorscheme
readonly FG_BASE03="\[$(tput setaf 8)\]"
readonly FG_BASE02="\[$(tput setaf 0)\]"
readonly FG_BASE01="\[$(tput setaf 10)\]"
readonly FG_BASE00="\[$(tput setaf 11)\]"
readonly FG_BASE0="\[$(tput setaf 12)\]"
readonly FG_BASE1="\[$(tput setaf 14)\]"
readonly FG_BASE2="\[$(tput setaf 7)\]"
readonly FG_BASE3="\[$(tput setaf 15)\]"
readonly BG_BASE03="\[$(tput setab 8)\]"
readonly BG_BASE02="\[$(tput setab 0)\]"
readonly BG_BASE01="\[$(tput setab 10)\]"
readonly BG_BASE00="\[$(tput setab 11)\]"
readonly BG_BASE0="\[$(tput setab 12)\]"
readonly BG_BASE1="\[$(tput setab 14)\]"
readonly BG_BASE2="\[$(tput setab 7)\]"
readonly BG_BASE3="\[$(tput setab 15)\]"
readonly FG_YELLOW="\[$(tput setaf 3)\]"
readonly FG_ORANGE="\[$(tput setaf 9)\]"
readonly FG_RED="\[$(tput setaf 1)\]"
readonly FG_MAGENTA="\[$(tput setaf 5)\]"
readonly FG_VIOLET="\[$(tput setaf 13)\]"
readonly FG_BLUE="\[$(tput setaf 4)\]"
readonly FG_CYAN="\[$(tput setaf 6)\]"
readonly FG_GREEN="\[$(tput setaf 2)\]"
readonly BG_YELLOW="\[$(tput setab 3)\]"
readonly BG_ORANGE="\[$(tput setab 9)\]"
readonly BG_RED="\[$(tput setab 1)\]"
readonly BG_MAGENTA="\[$(tput setab 5)\]"
readonly BG_VIOLET="\[$(tput setab 13)\]"
readonly BG_BLUE="\[$(tput setab 4)\]"
readonly BG_CYAN="\[$(tput setab 6)\]"
readonly BG_GREEN="\[$(tput setab 2)\]"
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
__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 -q --short HEAD 2>/dev/null || $git_eng rev-list --abbrev-commit --max-count=1 HEAD 2>/dev/null)"
[ -n "$branch" ] || return # git branch not found
local marks
if [ -z "$DISABLE_GIT_STATUS" ]; then
# branch is modified?
[ -n "$($git_eng status --porcelain 2>/dev/null)" ] && marks+=" $GIT_BRANCH_CHANGED_SYMBOL"
# how many commits local branch is ahead/behind of remote?
local stat="$($git_eng status --porcelain --branch 2>/dev/null | 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"
fi
# print the git branch segment without a trailing newline
printf " $GIT_BRANCH_SYMBOL$branch$marks "
}
__virtualenv() {
# Copied from Python virtualenv's activate.sh script.
# https://github.com/pypa/virtualenv/blob/a9b4e673559a5beb24bac1a8fb81446dd84ec6ed/virtualenv_embedded/activate.sh#L62
# License: MIT
if [ "x${VIRTUAL_ENV-}" != "x" ]; then
if [ "`basename \"$VIRTUAL_ENV\"`" == "__" ]; then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
printf "[`basename \`dirname \"$VIRTUAL_ENV\"\``]"
else
printf "(`basename \"$VIRTUAL_ENV\"`)"
fi
fi
}
__pwd() {
# Use ~ to represent $HOME prefix
local pwd=$(pwd | sed -e "s|^$HOME|~|")
if [[ ( $pwd = ~\/*\/* || $pwd = \/*\/*/* ) && ${#pwd} -gt $MAX_PATH_LENGTH ]]; then
local IFS='/'
read -ra split <<< "$pwd"
if [[ $pwd = ~* ]]; then
pwd="~/.../${split[-1]}"
else
pwd="/${split[1]}/.../${split[-1]}"
fi
fi
printf "$pwd"
}
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_GREEN"
else
local BG_EXIT="$BG_RED"
fi
# Bash by default expands the content of PS1 unless promptvars is disabled.
# We must use another layer of reference to prevent expanding any user
# provided strings, which would cause security issues.
# POC: https://github.com/njhartwell/pw3nage
# Related fix in git-bash: https://github.com/git/git/blob/9d77b0405ce6b471cb5ce3a904368fc25e55643d/contrib/completion/git-prompt.sh#L324
__powerline_virtualenv="$(__virtualenv)"
__powerline_pwd="$(__pwd)"
__powerline_git_info="$(__git_info)"
PS1=""
if shopt -q promptvars; then
PS1+="$BG_BASE0$FG_BASE3\${__powerline_virtualenv}$RESET"
PS1+="$BG_BASE1$FG_BASE3 \${__powerline_pwd} $RESET"
PS1+="$BG_BLUE$FG_BASE3\${__powerline_git_info}$RESET"
else
# promptvars is disabled. Directly print out and unset unnecessary vars.
PS1+="$BG_BASE0$FG_BASE3${__powerline_virtualenv}$RESET"
PS1+="$BG_BASE1$FG_BASE3 ${__powerline_pwd} $RESET"
PS1+="$BG_BLUE$FG_BASE3${__powerline_git_info}$RESET"
unset __powerline_virtualenv
unset __powerline_pwd
unset __powerline_git_info
fi
PS1+="$BG_EXIT$FG_BASE3 $PS_SYMBOL $RESET "
}
PROMPT_COMMAND=ps1
}
__powerline
unset __powerline