-
Notifications
You must be signed in to change notification settings - Fork 0
/
.zsh-prompt.zsh
83 lines (75 loc) · 2.29 KB
/
.zsh-prompt.zsh
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
# Syntax: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html
#
# allowed colours: Red, Blue, Green, Cyan, Yellow, Magenta, Black & White
# - https://stackoverflow.com/questions/689765/how-can-i-change-the-color-of-my-prompt-in-zsh-different-from-normal-text
check_last_exit_code() {
local LAST_EXIT_CODE=$?
if [[ $LAST_EXIT_CODE -ne 0 ]]; then
echo "%{$fg[yellow]%}[%{$fg[red]%}$LAST_EXIT_CODE%{$fg[yellow]%}]%{$reset_color%}"
fi
}
get_git_color() {
# This is unnecessary perf cost, just insta-return
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
return
# For twitter source repo
if [[ "$PWD" = *source* ]]; then
return
fi
git diff --no-ext-diff --quiet &> /dev/null
if [ $? -eq 0 ]; then
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
else
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
fi
}
get_git() {
local ref
# the main cost of this file is evaluating the git refs: 15ms
ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0
echo "$(get_git_color){${ref#refs/heads/}}%{$reset_color%}"
}
ssh_name() {
local name="%{$fg[red]%}%n@%M>%{$reset_color%}"
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
echo $name
fi
}
CURRENT_TIME="%{$fg[cyan]%}%D %*%{$reset_color%}"
function zle-line-init {
# last exit code needs to go first cause you call a func in get git
EXIT_CODE=$(check_last_exit_code)
RPS1="$RIGHT_PROMPT $(get_git)$CURRENT_TIME $EXIT_CODE"
RPS2=$RPS1
zle reset-prompt
}
zle -N zle-line-init
PROMPT="$(ssh_name)%(?,%{$fg[yellow]%},%{$fg[red]%})%4~>%{$reset_color%} "
RPS1="$(get_git)$CURRENT_TIME $EXIT_CODE"
#ZSH_THEME_GIT_PROMPT_PREFIX=" %{$fg[cyan]%}("
#ZSH_THEME_GIT_PROMPT_SUFFIX=")%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[green]%}"
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}"
preexec() {
if [ -x "$(command -v gdate)" ]; then
timer=$(($(gdate +%s%N)/1000000))
else
timer=$(date +%s)
fi
}
precmd() {
if [ $timer ]; then
if [ -x "$(command -v gdate)" ]; then
local now=$(($(gdate +%s%N)/1000000))
local unit='ms'
else
local now=$(date +%s)
local unit='s'
fi
local elapsed=$(($now-$timer))
local elapsed_pretty=$(printf "%'d" $elapsed)
export RIGHT_PROMPT="%F{cyan}${elapsed_pretty}${unit}%{$reset_color%}"
unset timer
fi
}