irongit
dotfiles/oh-my-zsh/themes/bullet-train.zsh-theme
696 lines19 KB
1# README
2#
3# In order for this theme to render correctly, you will need a
4# [Powerline-patched font](https://github.com/Lokaltog/powerline-fonts).
5#
6# In addition, I recommend the
7# [Tomorrow Night theme](https://github.com/chriskempson/tomorrow-theme) and, if
8# you're using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over
9# Terminal.app - it has significantly better color fidelity.
10
11# ------------------------------------------------------------------------------
12# CONFIGURATION
13# The default configuration, that can be overwrite in your .zshrc file
14# ------------------------------------------------------------------------------
15
16VIRTUAL_ENV_DISABLE_PROMPT=true
17
18# Define order and content of prompt
19if [ ! -n "${BULLETTRAIN_PROMPT_ORDER+1}" ]; then
20 BULLETTRAIN_PROMPT_ORDER=(
21 time
22 status
23 custom
24 context
25 dir
26 screen
27 perl
28 ruby
29 virtualenv
30 nvm
31 aws
32 go
33 rust
34 elixir
35 git
36 hg
37 cmd_exec_time
38 )
39fi
40
41# PROMPT
42if [ ! -n "${BULLETTRAIN_PROMPT_CHAR+1}" ]; then
43 BULLETTRAIN_PROMPT_CHAR="\$"
44fi
45if [ ! -n "${BULLETTRAIN_PROMPT_ROOT+1}" ]; then
46 BULLETTRAIN_PROMPT_ROOT=true
47fi
48if [ ! -n "${BULLETTRAIN_PROMPT_SEPARATE_LINE+1}" ]; then
49 BULLETTRAIN_PROMPT_SEPARATE_LINE=true
50fi
51if [ ! -n "${BULLETTRAIN_PROMPT_ADD_NEWLINE+1}" ]; then
52 BULLETTRAIN_PROMPT_ADD_NEWLINE=true
53fi
54
55# STATUS
56if [ ! -n "${BULLETTRAIN_STATUS_EXIT_SHOW+1}" ]; then
57 BULLETTRAIN_STATUS_EXIT_SHOW=false
58fi
59if [ ! -n "${BULLETTRAIN_STATUS_BG+1}" ]; then
60 BULLETTRAIN_STATUS_BG=green
61fi
62if [ ! -n "${BULLETTRAIN_STATUS_ERROR_BG+1}" ]; then
63 BULLETTRAIN_STATUS_ERROR_BG=red
64fi
65if [ ! -n "${BULLETTRAIN_STATUS_FG+1}" ]; then
66 BULLETTRAIN_STATUS_FG=white
67fi
68
69# TIME
70if [ ! -n "${BULLETTRAIN_TIME_BG+1}" ]; then
71 BULLETTRAIN_TIME_BG=white
72fi
73if [ ! -n "${BULLETTRAIN_TIME_FG+1}" ]; then
74 BULLETTRAIN_TIME_FG=black
75fi
76
77# CUSTOM
78if [ ! -n "${BULLETTRAIN_CUSTOM_MSG+1}" ]; then
79 BULLETTRAIN_CUSTOM_MSG=false
80fi
81if [ ! -n "${BULLETTRAIN_CUSTOM_BG+1}" ]; then
82 BULLETTRAIN_CUSTOM_BG=black
83fi
84if [ ! -n "${BULLETTRAIN_CUSTOM_FG+1}" ]; then
85 BULLETTRAIN_CUSTOM_FG=default
86fi
87
88# VIRTUALENV
89if [ ! -n "${BULLETTRAIN_VIRTUALENV_BG+1}" ]; then
90 BULLETTRAIN_VIRTUALENV_BG=yellow
91fi
92if [ ! -n "${BULLETTRAIN_VIRTUALENV_FG+1}" ]; then
93 BULLETTRAIN_VIRTUALENV_FG=white
94fi
95if [ ! -n "${BULLETTRAIN_VIRTUALENV_PREFIX+1}" ]; then
96 BULLETTRAIN_VIRTUALENV_PREFIX=🐍
97fi
98
99# NVM
100if [ ! -n "${BULLETTRAIN_NVM_BG+1}" ]; then
101 BULLETTRAIN_NVM_BG=green
102fi
103if [ ! -n "${BULLETTRAIN_NVM_FG+1}" ]; then
104 BULLETTRAIN_NVM_FG=white
105fi
106if [ ! -n "${BULLETTRAIN_NVM_PREFIX+1}" ]; then
107 BULLETTRAIN_NVM_PREFIX="⬡ "
108fi
109
110# AWS
111if [ ! -n "${BULLETTRAIN_AWS_BG+1}" ]; then
112 BULLETTRAIN_AWS_BG=yellow
113fi
114if [ ! -n "${BULLETTRAIN_AWS_FG+1}" ]; then
115 BULLETTRAIN_AWS_FG=black
116fi
117if [ ! -n "${BULLETTRAIN_AWS_PREFIX+1}" ]; then
118 BULLETTRAIN_AWS_PREFIX="☁️"
119fi
120
121# RUBY
122if [ ! -n "${BULLETTRAIN_RUBY_BG+1}" ]; then
123 BULLETTRAIN_RUBY_BG=red
124fi
125if [ ! -n "${BULLETTRAIN_RUBY_FG+1}" ]; then
126 BULLETTRAIN_RUBY_FG=white
127fi
128if [ ! -n "${BULLETTRAIN_RUBY_PREFIX+1}" ]; then
129 BULLETTRAIN_RUBY_PREFIX=♦️
130fi
131
132# Go
133if [ ! -n "${BULLETTRAIN_GO_BG+1}" ]; then
134 BULLETTRAIN_GO_BG=cyan
135fi
136if [ ! -n "${BULLETTRAIN_GO_FG+1}" ]; then
137 BULLETTRAIN_GO_FG=white
138fi
139if [ ! -n "${BULLETTRAIN_GO_PREFIX+1}" ]; then
140 BULLETTRAIN_GO_PREFIX="go"
141fi
142
143# Rust
144if [ ! -n "${BULLETTRAIN_RUST_BG+1}" ]; then
145 BULLETTRAIN_RUST_BG=black
146fi
147if [ ! -n "${BULLETTRAIN_RUST_FG+1}" ]; then
148 BULLETTRAIN_RUST_FG=white
149fi
150if [ ! -n "${BULLETTRAIN_RUST_PREFIX+1}" ]; then
151 BULLETTRAIN_RUST_PREFIX="🦀"
152fi
153
154# Kubernetes Context
155if [ ! -n "${BULLETTRAIN_KCTX_BG+1}" ]; then
156 BULLETTRAIN_KCTX_BG=yellow
157fi
158if [ ! -n "${BULLETTRAIN_KCTX_FG+1}" ]; then
159 BULLETTRAIN_KCTX_FG=white
160fi
161if [ ! -n "${BULLETTRAIN_KCTX_PREFIX+1}" ]; then
162 BULLETTRAIN_KCTX_PREFIX="⎈"
163fi
164if [ ! -n "${BULLETTRAIN_KCTX_KCONFIG+1}" ]; then
165 BULLETTRAIN_KCTX_KCONFIG="${HOME}/.kube/config"
166fi
167if [ ! -n "${BULLETTRAIN_KCTX_KUBECTL+1}" ]; then
168 BULLETTRAIN_KCTX_KUBECTL="true"
169fi
170if [ ! -n "${BULLETTRAIN_KCTX_NAMESPACE+1}" ]; then
171 BULLETTRAIN_KCTX_NAMESPACE="true"
172fi
173
174# ELIXIR
175if [ ! -n "${BULLETTRAIN_ELIXIR_BG+1}" ]; then
176 BULLETTRAIN_ELIXIR_BG=magenta
177fi
178if [ ! -n "${BULLETTRAIN_ELIXIR_FG+1}" ]; then
179 BULLETTRAIN_ELIXIR_FG=white
180fi
181if [ ! -n "${BULLETTRAIN_ELIXIR_PREFIX+1}" ]; then
182 BULLETTRAIN_ELIXIR_PREFIX="💧"
183fi
184
185# DIR
186if [ ! -n "${BULLETTRAIN_DIR_BG+1}" ]; then
187 BULLETTRAIN_DIR_BG=blue
188fi
189if [ ! -n "${BULLETTRAIN_DIR_FG+1}" ]; then
190 BULLETTRAIN_DIR_FG=white
191fi
192if [ ! -n "${BULLETTRAIN_DIR_CONTEXT_SHOW+1}" ]; then
193 BULLETTRAIN_DIR_CONTEXT_SHOW=false
194fi
195if [ ! -n "${BULLETTRAIN_DIR_EXTENDED+1}" ]; then
196 BULLETTRAIN_DIR_EXTENDED=1
197fi
198
199# GIT
200if [ ! -n "${BULLETTRAIN_GIT_COLORIZE_DIRTY+1}" ]; then
201 BULLETTRAIN_GIT_COLORIZE_DIRTY=false
202fi
203if [ ! -n "${BULLETTRAIN_GIT_COLORIZE_DIRTY_FG_COLOR+1}" ]; then
204 BULLETTRAIN_GIT_COLORIZE_DIRTY_FG_COLOR=black
205fi
206if [ ! -n "${BULLETTRAIN_GIT_COLORIZE_DIRTY_BG_COLOR+1}" ]; then
207 BULLETTRAIN_GIT_COLORIZE_DIRTY_BG_COLOR=yellow
208fi
209if [ ! -n "${BULLETTRAIN_GIT_BG+1}" ]; then
210 BULLETTRAIN_GIT_BG=white
211fi
212if [ ! -n "${BULLETTRAIN_GIT_FG+1}" ]; then
213 BULLETTRAIN_GIT_FG=black
214fi
215if [ ! -n "${BULLETTRAIN_GIT_EXTENDED+1}" ]; then
216 BULLETTRAIN_GIT_EXTENDED=true
217fi
218if [ ! -n "${BULLETTRAIN_GIT_PROMPT_CMD+1}" ]; then
219 BULLETTRAIN_GIT_PROMPT_CMD="\$(git_prompt_info)"
220fi
221
222# PERL
223if [ ! -n "${BULLETTRAIN_PERL_BG+1}" ]; then
224 BULLETTRAIN_PERL_BG=yellow
225fi
226if [ ! -n "${BULLETTRAIN_PERL_FG+1}" ]; then
227 BULLETTRAIN_PERL_FG=black
228fi
229if [ ! -n "${BULLETTRAIN_PERL_PREFIX+1}" ]; then
230 BULLETTRAIN_PERL_PREFIX=🐪
231fi
232
233# CONTEXT
234if [ ! -n "${BULLETTRAIN_CONTEXT_BG+1}" ]; then
235 BULLETTRAIN_CONTEXT_BG=black
236fi
237if [ ! -n "${BULLETTRAIN_CONTEXT_FG+1}" ]; then
238 BULLETTRAIN_CONTEXT_FG=default
239fi
240if [ ! -n "${BULLETTRAIN_CONTEXT_HOSTNAME+1}" ]; then
241 BULLETTRAIN_CONTEXT_HOSTNAME=%m
242fi
243
244# GIT PROMPT
245if [ ! -n "${BULLETTRAIN_GIT_PREFIX+1}" ]; then
246 ZSH_THEME_GIT_PROMPT_PREFIX="\ue0a0 "
247else
248 ZSH_THEME_GIT_PROMPT_PREFIX=$BULLETTRAIN_GIT_PREFIX
249fi
250if [ ! -n "${BULLETTRAIN_GIT_SUFFIX+1}" ]; then
251 ZSH_THEME_GIT_PROMPT_SUFFIX=""
252else
253 ZSH_THEME_GIT_PROMPT_SUFFIX=$BULLETTRAIN_GIT_SUFFIX
254fi
255if [ ! -n "${BULLETTRAIN_GIT_DIRTY+1}" ]; then
256 ZSH_THEME_GIT_PROMPT_DIRTY=" %F{red}✘%F{black}"
257else
258 ZSH_THEME_GIT_PROMPT_DIRTY=$BULLETTRAIN_GIT_DIRTY
259fi
260if [ ! -n "${BULLETTRAIN_GIT_CLEAN+1}" ]; then
261 ZSH_THEME_GIT_PROMPT_CLEAN=" %F{green}✔%F{black}"
262else
263 ZSH_THEME_GIT_PROMPT_CLEAN=$BULLETTRAIN_GIT_CLEAN
264fi
265if [ ! -n "${BULLETTRAIN_GIT_ADDED+1}" ]; then
266 ZSH_THEME_GIT_PROMPT_ADDED=" %F{green}✚%F{black}"
267else
268 ZSH_THEME_GIT_PROMPT_ADDED=$BULLETTRAIN_GIT_ADDED
269fi
270if [ ! -n "${BULLETTRAIN_GIT_MODIFIED+1}" ]; then
271 ZSH_THEME_GIT_PROMPT_MODIFIED=" %F{blue}✹%F{black}"
272else
273 ZSH_THEME_GIT_PROMPT_MODIFIED=$BULLETTRAIN_GIT_MODIFIED
274fi
275if [ ! -n "${BULLETTRAIN_GIT_DELETED+1}" ]; then
276 ZSH_THEME_GIT_PROMPT_DELETED=" %F{red}✖%F{black}"
277else
278 ZSH_THEME_GIT_PROMPT_DELETED=$BULLETTRAIN_GIT_DELETED
279fi
280if [ ! -n "${BULLETTRAIN_GIT_UNTRACKED+1}" ]; then
281 ZSH_THEME_GIT_PROMPT_UNTRACKED=" %F{yellow}✭%F{black}"
282else
283 ZSH_THEME_GIT_PROMPT_UNTRACKED=$BULLETTRAIN_GIT_UNTRACKED
284fi
285if [ ! -n "${BULLETTRAIN_GIT_RENAMED+1}" ]; then
286 ZSH_THEME_GIT_PROMPT_RENAMED=" ➜"
287else
288 ZSH_THEME_GIT_PROMPT_RENAMED=$BULLETTRAIN_GIT_RENAMED
289fi
290if [ ! -n "${BULLETTRAIN_GIT_UNMERGED+1}" ]; then
291 ZSH_THEME_GIT_PROMPT_UNMERGED=" ═"
292else
293 ZSH_THEME_GIT_PROMPT_UNMERGED=$BULLETTRAIN_GIT_UNMERGED
294fi
295if [ ! -n "${BULLETTRAIN_GIT_AHEAD+1}" ]; then
296 ZSH_THEME_GIT_PROMPT_AHEAD=" ⬆"
297else
298 ZSH_THEME_GIT_PROMPT_AHEAD=$BULLETTRAIN_GIT_AHEAD
299fi
300if [ ! -n "${BULLETTRAIN_GIT_BEHIND+1}" ]; then
301 ZSH_THEME_GIT_PROMPT_BEHIND=" ⬇"
302else
303 ZSH_THEME_GIT_PROMPT_BEHIND=$BULLETTRAIN_GIT_BEHIND
304fi
305if [ ! -n "${BULLETTRAIN_GIT_DIVERGED+1}" ]; then
306 ZSH_THEME_GIT_PROMPT_DIVERGED=" ⬍"
307else
308 ZSH_THEME_GIT_PROMPT_DIVERGED=$BULLETTRAIN_GIT_PROMPT_DIVERGED
309fi
310
311# SCREEN
312if [ ! -n "${BULLETTRAIN_SCREEN_BG+1}" ]; then
313 BULLETTRAIN_SCREEN_BG=white
314fi
315if [ ! -n "${BULLETTRAIN_SCREEN_FG+1}" ]; then
316 BULLETTRAIN_SCREEN_FG=black
317fi
318if [ ! -n "${BULLETTRAIN_SCREEN_PREFIX+1}" ]; then
319 BULLETTRAIN_SCREEN_PREFIX="⬗"
320fi
321
322# COMMAND EXECUTION TIME
323if [ ! -n "${BULLETTRAIN_EXEC_TIME_ELAPSED+1}" ]; then
324 BULLETTRAIN_EXEC_TIME_ELAPSED=5
325fi
326if [ ! -n "${BULLETTRAIN_EXEC_TIME_BG+1}" ]; then
327 BULLETTRAIN_EXEC_TIME_BG=yellow
328fi
329if [ ! -n "${BULLETTRAIN_EXEC_TIME_FG+1}" ]; then
330 BULLETTRAIN_EXEC_TIME_FG=black
331fi
332
333
334# ------------------------------------------------------------------------------
335# SEGMENT DRAWING
336# A few functions to make it easy and re-usable to draw segmented prompts
337# ------------------------------------------------------------------------------
338
339CURRENT_BG='NONE'
340SEGMENT_SEPARATOR=''
341
342# Begin a segment
343# Takes three arguments, background, foreground and text. All of them can be omitted,
344# rendering default background/foreground and no text.
345prompt_segment() {
346 local bg fg
347 [[ -n $1 ]] && bg="%K{$1}" || bg="%k"
348 [[ -n $2 ]] && fg="%F{$2}" || fg="%f"
349 if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
350 echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} "
351 else
352 echo -n "%{$bg%}%{$fg%} "
353 fi
354 CURRENT_BG=$1
355 [[ -n $3 ]] && echo -n $3
356}
357
358# End the prompt, closing any open segments
359prompt_end() {
360 if [[ -n $CURRENT_BG ]]; then
361 echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR"
362 else
363 echo -n "%{%k%}"
364 fi
365 echo -n "%{%f%}"
366 CURRENT_BG=''
367}
368
369# ------------------------------------------------------------------------------
370# PROMPT COMPONENTS
371# Each component will draw itself, and hide itself if no information needs
372# to be shown
373# ------------------------------------------------------------------------------
374
375# Context: user@hostname (who am I and where am I)
376context() {
377 local user="$(whoami)"
378 [[ "$user" != "$BULLETTRAIN_CONTEXT_DEFAULT_USER" || -n "$BULLETTRAIN_IS_SSH_CLIENT" ]] && echo -n "${user}@$BULLETTRAIN_CONTEXT_HOSTNAME"
379}
380
381prompt_context() {
382 local _context="$(context)"
383 [[ -n "$_context" ]] && prompt_segment $BULLETTRAIN_CONTEXT_BG $BULLETTRAIN_CONTEXT_FG "$_context"
384}
385
386# Based on http://stackoverflow.com/a/32164707/3859566
387function displaytime {
388 local T=$1
389 local D=$((T/60/60/24))
390 local H=$((T/60/60%24))
391 local M=$((T/60%60))
392 local S=$((T%60))
393 [[ $D > 0 ]] && printf '%dd' $D
394 [[ $H > 0 ]] && printf '%dh' $H
395 [[ $M > 0 ]] && printf '%dm' $M
396 printf '%ds' $S
397}
398
399# Prompt previous command execution time
400preexec() {
401 cmd_timestamp=`date +%s`
402}
403
404precmd() {
405 local stop=`date +%s`
406 local start=${cmd_timestamp:-$stop}
407 let BULLETTRAIN_last_exec_duration=$stop-$start
408 cmd_timestamp=''
409}
410
411prompt_cmd_exec_time() {
412 [ $BULLETTRAIN_last_exec_duration -gt $BULLETTRAIN_EXEC_TIME_ELAPSED ] && prompt_segment $BULLETTRAIN_EXEC_TIME_BG $BULLETTRAIN_EXEC_TIME_FG "$(displaytime $BULLETTRAIN_last_exec_duration)"
413}
414
415# Custom
416prompt_custom() {
417 if [[ $BULLETTRAIN_CUSTOM_MSG == false ]]; then
418 return
419 fi
420
421 local custom_msg
422 eval custom_msg=$BULLETTRAIN_CUSTOM_MSG
423 [[ -n "${custom_msg}" ]] && prompt_segment $BULLETTRAIN_CUSTOM_BG $BULLETTRAIN_CUSTOM_FG "${custom_msg}"
424}
425
426# Git
427prompt_git() {
428 if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" == "1" ]]; then
429 return
430 fi
431
432 local ref dirty mode repo_path git_prompt
433 repo_path=$(git rev-parse --git-dir 2>/dev/null)
434
435 if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
436 if [[ $BULLETTRAIN_GIT_COLORIZE_DIRTY == true && -n $(git status --porcelain --ignore-submodules) ]]; then
437 BULLETTRAIN_GIT_BG=$BULLETTRAIN_GIT_COLORIZE_DIRTY_BG_COLOR
438 BULLETTRAIN_GIT_FG=$BULLETTRAIN_GIT_COLORIZE_DIRTY_FG_COLOR
439 fi
440 prompt_segment $BULLETTRAIN_GIT_BG $BULLETTRAIN_GIT_FG
441
442 eval git_prompt=${BULLETTRAIN_GIT_PROMPT_CMD}
443 if [[ $BULLETTRAIN_GIT_EXTENDED == true ]]; then
444 echo -n ${git_prompt}$(git_prompt_status)
445 else
446 echo -n ${git_prompt}
447 fi
448 fi
449}
450
451prompt_hg() {
452 local rev status
453 if $(hg id >/dev/null 2>&1); then
454 if $(hg prompt >/dev/null 2>&1); then
455 if [[ $(hg prompt "{status|unknown}") = "?" ]]; then
456 # if files are not added
457 prompt_segment red white
458 st='±'
459 elif [[ -n $(hg prompt "{status|modified}") ]]; then
460 # if any modification
461 prompt_segment yellow black
462 st='±'
463 else
464 # if working copy is clean
465 prompt_segment green black
466 fi
467 echo -n $(hg prompt "☿ {rev}@{branch}") $st
468 else
469 st=""
470 rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g')
471 branch=$(hg id -b 2>/dev/null)
472 if $(hg st | grep -Eq "^\?"); then
473 prompt_segment red black
474 st='±'
475 elif $(hg st | grep -Eq "^(M|A)"); then
476 prompt_segment yellow black
477 st='±'
478 else
479 prompt_segment green black
480 fi
481 echo -n "☿ $rev@$branch" $st
482 fi
483 fi
484}
485
486# Dir: current working directory
487prompt_dir() {
488 local dir=''
489 local _context="$(context)"
490 [[ $BULLETTRAIN_DIR_CONTEXT_SHOW == true && -n "$_context" ]] && dir="${dir}${_context}:"
491
492 if [[ $BULLETTRAIN_DIR_EXTENDED == 0 ]]; then
493 #short directories
494 dir="${dir}%1~"
495 elif [[ $BULLETTRAIN_DIR_EXTENDED == 2 ]]; then
496 #long directories
497 dir="${dir}%0~"
498 else
499 #medium directories (default case)
500 dir="${dir}%4(c:...:)%3c"
501 fi
502
503 prompt_segment $BULLETTRAIN_DIR_BG $BULLETTRAIN_DIR_FG $dir
504}
505
506# RUBY
507# RVM: only shows RUBY info if on a gemset that is not the default one
508# RBENV: shows current ruby version active in the shell; also with non-global gemsets if any is active
509# CHRUBY: shows current ruby version active in the shell
510prompt_ruby() {
511 if command -v rvm-prompt > /dev/null 2>&1; then
512 prompt_segment $BULLETTRAIN_RUBY_BG $BULLETTRAIN_RUBY_FG $BULLETTRAIN_RUBY_PREFIX" $(rvm-prompt i v g)"
513 elif command -v chruby > /dev/null 2>&1; then
514 prompt_segment $BULLETTRAIN_RUBY_BG $BULLETTRAIN_RUBY_FG $BULLETTRAIN_RUBY_PREFIX" $(chruby | sed -n -e 's/ \* //p')"
515 elif command -v rbenv > /dev/null 2>&1; then
516 current_gemset() {
517 echo "$(rbenv gemset active 2&>/dev/null | sed -e 's/ global$//')"
518 }
519
520 if [[ -n $(current_gemset) ]]; then
521 prompt_segment $BULLETTRAIN_RUBY_BG $BULLETTRAIN_RUBY_FG $BULLETTRAIN_RUBY_PREFIX" $(rbenv version | sed -e 's/ (set.*$//')"@"$(current_gemset)"
522 else
523 prompt_segment $BULLETTRAIN_RUBY_BG $BULLETTRAIN_RUBY_FG $BULLETTRAIN_RUBY_PREFIX" $(rbenv version | sed -e 's/ (set.*$//')"
524 fi
525 fi
526}
527
528# ELIXIR
529prompt_elixir() {
530 if command -v elixir > /dev/null 2>&1; then
531 prompt_segment $BULLETTRAIN_ELIXIR_BG $BULLETTRAIN_ELIXIR_FG $BULLETTRAIN_ELIXIR_PREFIX" $(elixir -v | tail -n 1 | awk '{print $2}')"
532 fi
533}
534
535# PERL
536# PLENV: shows current PERL version active in the shell
537prompt_perl() {
538 if command -v plenv > /dev/null 2>&1; then
539 prompt_segment $BULLETTRAIN_PERL_BG $BULLETTRAIN_PERL_FG $BULLETTRAIN_PERL_PREFIX" $(plenv version | sed -e 's/ (set.*$//')"
540 fi
541}
542
543# Go
544prompt_go() {
545 setopt extended_glob
546 if [[ (-f *.go(#qN) || -d Godeps || -f glide.yaml) ]]; then
547 if command -v go > /dev/null 2>&1; then
548 prompt_segment $BULLETTRAIN_GO_BG $BULLETTRAIN_GO_FG $BULLETTRAIN_GO_PREFIX" $(go version | grep --colour=never -oE '[[:digit:]].[[:digit:]]+')"
549 fi
550 fi
551}
552
553# Rust
554prompt_rust() {
555 if [[ (-f Cargo.toml) ]]; then
556 if command -v rustc > /dev/null 2>&1; then
557 prompt_segment $BULLETTRAIN_RUST_BG $BULLETTRAIN_RUST_FG $BULLETTRAIN_RUST_PREFIX" $(rustc -V version | cut -d' ' -f2)"
558 fi
559 fi
560}
561
562# Kubernetes Context
563prompt_kctx() {
564 if [[ "$BULLETTRAIN_KCTX_KUBECTL" == "true" ]] && command -v kubectl > /dev/null 2>&1; then
565 local jsonpath='{.current-context}'
566 if [[ "$BULLETTRAIN_KCTX_NAMESPACE" == "true" ]]; then
567 jsonpath="${jsonpath}{':'}{..namespace}"
568 fi
569 prompt_segment $BULLETTRAIN_KCTX_BG $BULLETTRAIN_KCTX_FG $BULLETTRAIN_KCTX_PREFIX" $(kubectl config view --minify --output "jsonpath=${jsonpath}" 2>/dev/null)"
570 elif [[ -f $BULLETTRAIN_KCTX_KCONFIG ]]; then
571 prompt_segment $BULLETTRAIN_KCTX_BG $BULLETTRAIN_KCTX_FG $BULLETTRAIN_KCTX_PREFIX" $(cat $BULLETTRAIN_KCTX_KCONFIG | grep current-context | awk '{print $2}')"
572 fi
573}
574
575# Virtualenv: current working virtualenv
576prompt_virtualenv() {
577 local virtualenv_path="$VIRTUAL_ENV"
578 if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then
579 prompt_segment $BULLETTRAIN_VIRTUALENV_BG $BULLETTRAIN_VIRTUALENV_FG $BULLETTRAIN_VIRTUALENV_PREFIX" $(basename $virtualenv_path)"
580 elif which pyenv &> /dev/null; then
581 if [[ "$(pyenv version | sed -e 's/ (set.*$//' | tr '\n' ' ' | sed 's/.$//')" != "system" ]]; then
582 prompt_segment $BULLETTRAIN_VIRTUALENV_BG $BULLETTRAIN_VIRTUALENV_FG $BULLETTRAIN_VIRTUALENV_PREFIX" $(pyenv version | sed -e 's/ (set.*$//' | tr '\n' ' ' | sed 's/.$//')"
583 fi
584 fi
585}
586
587# NVM: Node version manager
588prompt_nvm() {
589 local nvm_prompt
590 if type nvm >/dev/null 2>&1; then
591 nvm_prompt=$(nvm current 2>/dev/null)
592 [[ "${nvm_prompt}x" == "x" || "${nvm_prompt}" == "system" ]] && return
593 elif type node >/dev/null 2>&1; then
594 nvm_prompt="$(node --version)"
595 else
596 return
597 fi
598 nvm_prompt=${nvm_prompt}
599 prompt_segment $BULLETTRAIN_NVM_BG $BULLETTRAIN_NVM_FG $BULLETTRAIN_NVM_PREFIX$nvm_prompt
600}
601
602#AWS Profile
603prompt_aws() {
604 local spaces=" "
605
606 if [[ -n "$AWS_PROFILE" ]]; then
607 prompt_segment $BULLETTRAIN_AWS_BG $BULLETTRAIN_AWS_FG $BULLETTRAIN_AWS_PREFIX$spaces$AWS_PROFILE
608 fi
609}
610
611# SCREEN Session
612prompt_screen() {
613 local session_name="$STY"
614 if [[ "$session_name" != "" ]]; then
615 prompt_segment $BULLETTRAIN_SCREEN_BG $BULLETTRAIN_SCREEN_FG $BULLETTRAIN_SCREEN_PREFIX" $session_name"
616 fi
617}
618
619prompt_time() {
620 if [[ $BULLETTRAIN_TIME_12HR == true ]]; then
621 prompt_segment $BULLETTRAIN_TIME_BG $BULLETTRAIN_TIME_FG %D{%r}
622 else
623 prompt_segment $BULLETTRAIN_TIME_BG $BULLETTRAIN_TIME_FG %D{%T}
624 fi
625}
626
627# Status:
628# - was there an error
629# - am I root
630# - are there background jobs?
631prompt_status() {
632 local symbols
633 symbols=()
634 [[ $RETVAL -ne 0 && $BULLETTRAIN_STATUS_EXIT_SHOW != true ]] && symbols+="✘"
635 [[ $RETVAL -ne 0 && $BULLETTRAIN_STATUS_EXIT_SHOW == true ]] && symbols+="✘ $RETVAL"
636 [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡%f"
637 [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="⚙"
638
639 if [[ -n "$symbols" && $RETVAL -ne 0 ]]; then
640 prompt_segment $BULLETTRAIN_STATUS_ERROR_BG $BULLETTRAIN_STATUS_FG "$symbols"
641 elif [[ -n "$symbols" ]]; then
642 prompt_segment $BULLETTRAIN_STATUS_BG $BULLETTRAIN_STATUS_FG "$symbols"
643 fi
644
645}
646
647# Prompt Character
648prompt_chars() {
649 local bt_prompt_chars="${BULLETTRAIN_PROMPT_CHAR}"
650
651 if [[ $BULLETTRAIN_PROMPT_ROOT == true ]]; then
652 bt_prompt_chars="%(!.%F{red}# .%F{green}${bt_prompt_chars}%f)"
653 fi
654
655 if [[ $BULLETTRAIN_PROMPT_SEPARATE_LINE == false ]]; then
656 bt_prompt_chars="${bt_prompt_chars}"
657 fi
658
659 echo -n "$bt_prompt_chars"
660
661 if [[ -n $BULLETTRAIN_PROMPT_CHAR ]]; then
662 echo -n " "
663 fi
664}
665
666# Prompt Line Separator
667prompt_line_sep() {
668 if [[ $BULLETTRAIN_PROMPT_SEPARATE_LINE == true ]]; then
669 # newline wont print without a non newline character, so add a zero-width space
670 echo -e '\n%{\u200B%}'
671 fi
672}
673
674# ------------------------------------------------------------------------------
675# MAIN
676# Entry point
677# ------------------------------------------------------------------------------
678
679build_prompt() {
680 RETVAL=$?
681 for segment in $BULLETTRAIN_PROMPT_ORDER
682 do
683 prompt_$segment
684 done
685 prompt_end
686}
687
688NEWLINE='
689'
690PROMPT=''
691[[ $BULLETTRAIN_PROMPT_ADD_NEWLINE == true ]] && PROMPT="$PROMPT$NEWLINE"
692PROMPT="$PROMPT"'%{%f%b%k%}$(build_prompt)'
693[[ $BULLETTRAIN_PROMPT_SEPARATE_LINE == true ]] && PROMPT="$PROMPT$NEWLINE"
694PROMPT="$PROMPT"'%{${fg_bold[default]}%}'
695[[ $BULLETTRAIN_PROMPT_SEPARATE_LINE == false ]] && PROMPT="$PROMPT "
696PROMPT="$PROMPT"'$(prompt_chars)%{$reset_color%}'