forked from seebi/zshrc
-
Notifications
You must be signed in to change notification settings - Fork 1
/
prompt.zsh
142 lines (122 loc) · 4.19 KB
/
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
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
# enable hook method
autoload add-zsh-hook
# enable and configure vcs_info
autoload -Uz vcs_info
add-zsh-hook precmd vcs_info
zstyle ':vcs_info:*' enable hg git cvs svn
zstyle ':vcs_info:*' formats '%s|%b|%a|%i|%R|%r|%S|%m'
# my prompt theme
function promptSetup () {
setopt prompt_subst
local TERMWIDTH
(( TERMWIDTH = ${COLUMNS} - 1 ))
NOCOLOR="%{$terminfo[sgr0]%}"
PS1=''; RPS1=''
PS2="↷ %_>"; RPS2=''
PS3="↷ ?#"; RPS3=''
PS4="↷ +i>"; RPS3=''
# prepare vcs info
VCS_LINE=''
VCS=$vcs_info_msg_0_
VCS_TYPE=$VCS[(ws:|:)1]
VCS_BRANCH=$VCS[(ws:|:)2]
VCS_CHANGES=''
# setup the prompt sign
if [[ $VCS_TYPE != '' ]]; then
VCS_LINE+=$NOCOLOR
# VCS_LINE+='➜ '
case $VCS_TYPE in
'hg')
VCS_LINE+='☿ '
VCS_CHANGES=`hg st 2>/dev/null | wc -l`
;;
'git')
TOP=$(git rev-parse --show-toplevel); TOP=${TOP##*/};
DESC=`g desc`
VCS_LINE+="± $VCS_BRANCH @ $TOP / $DESC"
;;
*)
VCS_LINE+="$VCS_TYPE "
;;
esac
fi
if [[ $VCS_CHANGES > 0 ]]; then
VCS_LINE+="%F{166}%B"
VCS_LINE+='★ '
VCS_LINE+="$VCS_CHANGES "
fi
# rootshell gets another prompt sign
CURRENT_USER=`whoami`
PR_SIGN=$NOCOLOR
PR_SIGN+="%F{160}%B"
# prepend the hostname if we are outside
if [[ "$MYHOSTEXPRESSION" == "" ]]; then
# if not set, home is nowhere
MYHOSTEXPRESSION="^$"
fi
if [[ "`hostname`" =~ "$MYHOSTEXPRESSION" ]]; then
# we are on our home desktop
else
# we are outside on a server
PR_SIGN+="`hostname` "
fi
# setup the main sign
if [[ $CURRENT_USER == 'root' ]]; then
PR_SIGN+="☠"
elif [[ $CURRENT_USER == 'vagrant' ]]; then
PR_SIGN+="𝓥"
else
PR_SIGN+="∴"
fi
PR_SIGN+="%F{white}%b"
# http://unix.stackexchange.com/questions/1022/is-it-possible-to-display-stuff-below-the-prompt-at-a-prompt
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
# Finally, the prompt.
PS1=$'\n' # newline (specially quotet, see zsh FAQ 3.13)
PS1+="%{$terminfo_down_sc$VCS_LINE$terminfo[rc]%}" # the second line
# PS1+=$PR_STITLE # tmux title if present
PS1+=$PR_VCSSIGN # version control part if present
PS1+=%(?..'%F{136}%B%'?) # output last error number if present
PS1+=$PR_SIGN # the user sign
PS1+=" " # an additional space
# reset the tmux title
# promptSetMultiplexerTabTitle "zsh"
}
add-zsh-hook precmd promptSetup
# set a tmux / screen 'tabulator' title if needed
# function promptSetMultiplexerTabTitle () {
# if [[ "$TERM" == "screen" ]]; then
# if [[ "$1" == "" ]]; then
# local CMD=${1[(wr)^(*=*|sudo|-*)]}
# echo -n "\ekttt$CMD\e\\"
# else
# local title="$1 ttt" # I dont know how to prevent errors on one word strings
# title=$title[(w)1]
# echo -n "\ek$title\e\\"
# fi
# fi
# }
# add-zsh-hook preexec promptSetMultiplexerTabTitle
# setup tmux environment (context + status)
# TODO: shorten the path variable
# TODO: remove sudo if available...
# function tmuxChangeDirectory () {
# # set the tmux status line
# if [[ "$TMUX" != "" ]]; then
# newMailCountTool="/home/seebi/bin/scripts/newMailCount.py"
# tmux set-option -g status-right "$PWD ✉ #($newMailCountTool $MAIL)" | tee >/dev/null
# fi
# if [[ $VCS_TYPE == 'hg' ]]; then
# #tmux kill-pane -t 1
# #tmux split-window -h -l 40 "while true; do clear; date; echo; hg xlog-small -l 5 || exit; sleep 600; done;"
# #tmux select-pane -t 0
# fi
# }
# add-zsh-hook chpwd tmuxChangeDirectory
# remove the line after the prompt on execution
# http://unix.stackexchange.com/questions/1022/is-it-possible-to-display-stuff-below-the-prompt-at-a-prompt
function eraseSecondLine () {
print -rn -- $terminfo[el];
#echo; # this would keep the second line
}
add-zsh-hook preexec eraseSecondLine