-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathprompt_hjem_setup
176 lines (148 loc) · 5.97 KB
/
prompt_hjem_setup
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
168
169
170
171
172
173
174
175
176
prompt_hjem_help () {
cat <<'EOF'
hjem [home is where my prompt is]
usage: prompt hjem [8bit] [vimode] [<color1> [<color2> [<color3> [<color4>]]]]
8bit: use 8bit chars
vimode: show vi mode
color1: hyphens (default: green)
color2: brackets (default: green)
color3: working directory (default: yellow)
color4: user@host (default: cyan)
EOF
}
function prompt_hjem_setup {
if [[ $1 == '8bit' ]]; then
shift
prompt_hjem_lc1='╭'
prompt_hjem_lc2='╰'
prompt_hjem_hyphen='─'
prompt_hjem_arrow='➤'
prompt_hjem_dots='…'
else
prompt_hjem_hyphen='-'
prompt_hjem_lc1=','
prompt_hjem_lc2='\`'
prompt_hjem_arrow='>'
prompt_hjem_dots='...'
fi
if [[ $1 == 'vimode' ]]; then
shift
prompt_hjem_vimode=1
zle -N zle-keymap-select
else
prompt_hjem_vimode=0
fi
# set reset_color if not defined
if [[ -z $reset_color ]]; then
local lc=$'\e[' rc=m
typeset -Hg reset_color
reset_color="$lc${color[0]}$rc"
fi
prompt_hjem_color1=${1:-'green'} # hyphens
prompt_hjem_color2=${2:-'green'} # brackets
prompt_hjem_color3=${3:-'yellow'} # working directory
prompt_hjem_color4=${4:-${${SSH_CLIENT+'yellow'}:-'cyan'}} # user@host
prompt_hjem_chyphen="%F{$prompt_hjem_color1}${prompt_hjem_hyphen}%{$reset_color%}"
prompt_hjem_clc1="%F{$prompt_hjem_color1}${prompt_hjem_lc1}%{$reset_color%}"
prompt_hjem_clc2="%F{$prompt_hjem_color1}${prompt_hjem_lc2}%{$reset_color%}"
prompt_hjem_cop="%F{$prompt_hjem_color2}<%{$reset_color%}"
prompt_hjem_ccp="%F{$prompt_hjem_color2}>%{$reset_color%}"
local path_p="${prompt_hjem_cop}%F{$prompt_hjem_color3}%B%~%b${prompt_hjem_ccp}"
local user_host="${prompt_hjem_cop}%(!,%F{red},%F{$prompt_hjem_color4})%n%F{$prompt_hjem_color4}%B@%m%b${prompt_hjem_ccp}"
local success="%(?,${prompt_hjem_hyphen}${prompt_hjem_arrow},%F{red}${prompt_hjem_hyphen}${prompt_hjem_arrow}%{$reset_color%})"
prompt_hjem_1a="${prompt_hjem_clc1}${prompt_hjem_chyphen}${path_p}"
prompt_hjem_1b="${user_host}"
prompt_hjem_2a="${prompt_hjem_clc2}${prompt_hjem_chyphen}"
prompt_hjem_2b="${success} "
PROMPT2=" [%_]${prompt_hjem_hyphen}${prompt_hjem_arrow} "
prompt_newline=$'%1(l.\n.)'
prompt_opts=(cr subst percent)
add-zsh-hook precmd prompt_hjem_precmd
}
function prompt_hjem_construct_l {
# calculate width
local term_width=$((COLUMNS - 1))
local prompt_1a_width=${#${(S%%)prompt_hjem_1a//(\%([KF1]|)\{*\}|\%[Bbkf])}}
local prompt_1b_width=${#${(S%%)prompt_hjem_1b//(\%([KF1]|)\{*\}|\%[Bbkf])}}
function setup_prompt {
padding=$(printf "${prompt_hjem_hyphen}%.0s" {1..$2})
# show git repo in PROMPT
git_prompt=''
git_status=`git status --porcelain 2>/dev/null`
if [[ $? == 0 ]]; then
local git_stat=""
# unstaged/untracked/added/staged files
[ $(echo $git_status | grep -E "^ M|^\?\?|^A|^M" | wc -l) != 0 ] && git_stat="*"
# put to prompt
[ -z "$git_stat" ] && git_color="green" || git_color="red"
local git_repo=$(git symbolic-ref HEAD 2> /dev/null | cut -b 12-)
git_prompt="%F{$git_color}[${git_repo}${git_stat}]%{$reset_color%}"
fi
PROMPT="$1%F{$prompt_hjem_color1}$padding%{$reset_color%}$3${prompt_newline}$prompt_hjem_2a$git_prompt$prompt_hjem_2b"
}
# add padding and check width
local padding_size=$((term_width - prompt_1a_width - prompt_1b_width))
if [[ $padding_size > 0 ]]; then
setup_prompt $prompt_hjem_1a $padding_size $prompt_hjem_1b
return
fi
# try without user@host
padding_size=$((term_width - prompt_1a_width))
if [[ $padding_size > 0 ]]; then
setup_prompt $prompt_hjem_1a $padding_size
return
fi
# still to wide? truncate path...
local prompt_pwd_size=$((term_width - 5))
setup_prompt "${prompt_hjem_clc1}${prompt_hjem_chyphen}${prompt_hjem_cop}%B%F{$prompt_hjem_color3}%$prompt_pwd_size<${prompt_hjem_dots}<%~%<<%{$reset_color%}${prompt_hjem_ccp}" 1
}
function prompt_hjem_construct_r {
RPROMPT=""
# add VIMODE to RPROMPT
[[ $prompt_hjem_vimode == 1 ]] && RPROMPT="$RPROMPT%F{$prompt_hjem_color2}$VIMODE%{$reset_color%}"
}
function prompt_hjem_construct {
prompt_hjem_construct_l
prompt_hjem_construct_r
}
function prompt_hjem_precmd {
# register for TRAPWINCH signal
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_hjem_winch} prompt_hjem_winch"
# init vi mode
VIMODE="%{$bg[green]%}%{$fg[white]%}%B I %{$reset_color%}"
# construct prompt
prompt_hjem_construct
# set fg color
zle_highlight[(r)default:*]="default:fg=bold"
}
# update vimode on keymap change
function zle-keymap-select {
# only update if still using our precmd,
# otherwise remove keymap binding
if [[ $precmd_functions = *prompt_hjem_precmd* ]]; then
case $KEYMAP in
main|viins ) VIMODE="%{$bg[green]%}%{$fg[white]%}%B I %{$reset_color%}" ;;
vicmd ) VIMODE="%{$bg[blue]%}%{$fg[white]%}%B N %{$reset_color%}" ;;
vivis|vivli ) VIMODE="%{$bg[magenta]%}%{$fg[white]%}%B V %{$reset_color%}" ;;
virep ) VIMODE="%{$bg[red]%}%{$fg[white]%}%B R %{$reset_color%}" ;;
esac
if [[ $prompt_hjem_vimode == 1 ]]; then
prompt_hjem_construct_r
zle && zle reset-prompt
fi
else
zle -D zle-keymap-select
fi
}
# reload prompt on window resize
function prompt_hjem_winch {
# only update if still using our precmd,
# otherwise delete ourself from TRAPWINCH
if [[ $precmd_functions = *prompt_hjem_precmd* ]]; then
prompt_hjem_construct_l
zle && zle reset-prompt
else
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_hjem_winch}"
fi
}
prompt_hjem_setup "$@"