Jay Taylor's notes
back to listing indexpaulirish/dotfiles
[web search]
Original source (github.com)
Clipped on: 2017-10-08
1 | # This prompt inspired by gf3, sindresorhus, alrra, and mathiasbynens. |
2 | # but customized to me. <3 |
3 | |
4 | default_username='paulirish' |
5 | |
6 | |
7 | if which thefuck > /dev/null; then |
8 | eval "$(thefuck --alias)" |
9 | fi; |
10 | |
11 | # Automatically trim long paths in the prompt (requires Bash 4.x) |
12 | PROMPT_DIRTRIM=2 |
13 | |
14 | if [[ -n "$ZSH_VERSION" ]]; then # quit now if in zsh |
15 | return 1 2> /dev/null || exit 1; |
16 | fi; |
17 | |
18 | |
19 | if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then |
20 | export TERM=gnome-256color |
21 | elif infocmp xterm-256color >/dev/null 2>&1; then |
22 | export TERM=xterm-256color |
23 | fi |
24 | |
25 | |
26 | set_prompts() { |
27 | |
28 | local black="" blue="" bold="" cyan="" green="" orange="" \ |
29 | purple="" red="" reset="" white="" yellow="" |
30 | |
31 | local dateCmd="" |
32 | |
33 | if [ -x /usr/bin/tput ] && tput setaf 1 &> /dev/null; then |
34 | |
35 | tput sgr0 # Reset colors |
36 | |
37 | bold=$(tput bold) |
38 | reset=$(tput sgr0) |
39 | |
40 | # Solarized colors |
41 | # (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values) |
42 | black=$(tput setaf 0) |
43 | blue=$(tput setaf 33) |
44 | cyan=$(tput setaf 37) |
45 | green=$(tput setaf 190) |
46 | orange=$(tput setaf 172) |
47 | purple=$(tput setaf 141) |
48 | red=$(tput setaf 124) |
49 | violet=$(tput setaf 61) |
50 | magenta=$(tput setaf 9) |
51 | white=$(tput setaf 8) |
52 | yellow=$(tput setaf 136) |
53 | |
54 | else |
55 | |
56 | bold="" |
57 | reset="\e[0m" |
58 | |
59 | black="\e[1;30m" |
60 | blue="\e[1;34m" |
61 | cyan="\e[1;36m" |
62 | green="\e[1;32m" |
63 | orange="\e[1;33m" |
64 | purple="\e[1;35m" |
65 | red="\e[1;31m" |
66 | magenta="\e[1;31m" |
67 | violet="\e[1;35m" |
68 | white="\e[1;37m" |
69 | yellow="\e[1;33m" |
70 | |
71 | fi |
72 | |
73 | # Only show username/host if not default |
74 | function usernamehost() { |
75 | |
76 | # Highlight the user name when logged in as root. |
77 | if [[ "${USER}" == *"root" ]]; then |
78 | userStyle="${red}"; |
79 | else |
80 | userStyle="${magenta}"; |
81 | fi; |
82 | |
83 | userhost="" |
84 | userhost+="\[${userStyle}\]$USER " |
85 | userhost+="\[${white}\]at " |
86 | userhost+="\[${orange}\]$HOSTNAME " |
87 | userhost+="\[${white}\]in" |
88 | |
89 | if [ $USER != "$default_username" ]; then echo $userhost ""; fi |
90 | } |
91 | |
92 | |
93 | function prompt_git() { |
94 | # this is >5x faster than mathias's. |
95 | |
96 | # check if we're in a git repo. (fast) |
97 | git rev-parse --is-inside-work-tree &>/dev/null || return |
98 | |
99 | # check for what branch we're on. (fast) |
100 | # if… HEAD isn’t a symbolic ref (typical branch), |
101 | # then… get a tracking remote branch or tag |
102 | # otherwise… get the short SHA for the latest commit |
103 | # lastly just give up. |
104 | branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ |
105 | git describe --all --exact-match HEAD 2> /dev/null || \ |
106 | git rev-parse --short HEAD 2> /dev/null || \ |
107 | echo '(unknown)')"; |
108 | |
109 | |
110 | ## early exit for Chromium & Blink repo, as the dirty check takes ~5s |
111 | ## also recommended (via goo.gl/wAVZLa ) : sudo sysctl kern.maxvnodes=$((512*1024)) |
112 | repoUrl=$(git config --get remote.origin.url) |
113 | if grep -q chromium.googlesource.com <<<$repoUrl; then |
114 | dirty=" ⁂" |
115 | else |
116 | |
117 | # check if it's dirty (slow) |
118 | # technique via github.com/git/git/blob/355d4e173/contrib/completion/git-prompt.sh#L472-L475 |
119 | dirty=$(git diff --no-ext-diff --quiet --ignore-submodules --exit-code || echo -e "*") |
120 | |
121 | # mathias has a few more checks some may like: |
122 | # github.com/mathiasbynens/dotfiles/blob/a8bd0d4300/.bash_prompt#L30-L43 |
123 | fi |
124 | |
125 | |
126 | [ -n "${s}" ] && s=" [${s}]"; |
127 | echo -e "${1}${branchName}${2}$dirty"; |
128 | |
129 | return |
130 | } |
131 | |
132 | |
133 | |
134 | # ------------------------------------------------------------------ |
135 | # | Prompt string | |
136 | # ------------------------------------------------------------------ |
137 | |
138 | PS1="\[\033]0;\w\007\]" # terminal title (set to the current working directory) |
139 | PS1+="\n\[$bold\]" |
140 | PS1+="\[$(usernamehost)\]" # username at host |
141 | PS1+="\[$green\]\w" # working directory |
142 | PS1+="\$(prompt_git \"$white on $purple\" \"$cyan\")" # git repository details |
143 | PS1+="\n" |
144 | PS1+="\[$reset$white\]\\$ \[$reset\]" |
145 | |
146 | export PS1 |
147 | |
148 | # ------------------------------------------------------------------ |
149 | # | Subshell prompt string | |
150 | # ------------------------------------------------------------------ |
151 | |
152 | export PS2="⚡ " |
153 | |
154 | # ------------------------------------------------------------------ |
155 | # | Debug prompt string (when using `set -x`) | |
156 | # ------------------------------------------------------------------ |
157 | |
158 | # When debugging a shell script via `set -x` this tricked-out prompt is used. |
159 | |
160 | # The first character (+) is used and repeated for stack depth |
161 | # Then, we log the current time, filename and line number, followed by function name, followed by actual source line |
162 | |
163 | # FWIW, I have spent hours attempting to get time-per-command in here, but it's not possible. ~paul |
164 | export PS4='+ \011\e[1;30m\t\011\e[1;34m${BASH_SOURCE}\e[0m:\e[1;36m${LINENO}\e[0m \011 ${FUNCNAME[0]:+\e[0;35m${FUNCNAME[0]}\e[1;30m()\e[0m:\011\011 }' |
165 | |
166 | |
167 | # shoutouts: |
168 | # https://github.com/dholm/dotshell/blob/master/.local/lib/sh/profile.sh is quite nice. |
169 | # zprof is also hot. |
170 | |
171 | } |
172 | |
173 | |
174 | |
175 | set_prompts |
176 | unset set_prompts |