-
Notifications
You must be signed in to change notification settings - Fork 0
/
zshrc
302 lines (263 loc) · 7.55 KB
/
zshrc
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# zsh options. {{{
# Each group corresponds to a heading in the zshoptions manpage.
# dir opts
setopt autocd autopushd pushd_silent
# completion opts
setopt autolist autoparamkeys autoparamslash hashlistall listambiguous listpacked listtypes
# expansion and globbing
setopt extended_glob glob glob_dots
# history opts
setopt share_history extended_history hist_ignore_space
# I/O
setopt aliases clobber correct hashcmds hashdirs ignoreeof rmstarsilent normstarwait
# job control
setopt autoresume notify
# prompting
setopt promptpercent
# scripts and functions
setopt cbases functionargzero localoptions multios
# ZLE
setopt nobeep zle
# emergency file ops
# Per zshmodules(1), this form only loads prefixed builtins, which avoids
# shadowing the more capable external versions.
zmodload -m -F zsh/files b:zf_\*
# This only loads the zstat builtin and does not shadow the more capable
# external stat.
zmodload -F zsh/stat b:zstat
zmodload zsh/sched
####################################### }}}
# Load the modular parts. {{{
if [ -d ~/.zsh ]; then
for zfile in `ls ~/.zsh/*.zsh`; do
source $zfile
done
fi
####################################### }}}
# Set up colors. {{{
autoload -U colors; colors
for c in RED GREEN BLUE YELLOW MAGENTA CYAN WHITE BLACK; do
eval T_$c='${fg[${(L)c}]}'
eval PR_$c='%{$T_'$c'%}'
done
T_NO_COLOR="${reset_color}"
PR_NO_COLOR="%{$T_NO_COLOR%}"
####################################### }}}
# Command functions. {{{
getfstype() {
local DIR=`absname $1`
if [ ! "$DIR" ]; then; return; fi
# zsh lacks a do while, so I went with an explicit break from an infinite
# loop. This will terminate as long as your cwd is of finite length.
while (true); do
local FS=`mount | grep " $DIR " | sed 's/.*type //' | sed 's/ .*//'`
if [ "$FS" ]; then
print $FS
break
fi
if [[ "$DIR" == '/' ]]; then
break
fi
DIR=`dirname $DIR`
done
}
####################################### }}}
# Shell configuration. {{{
umask 022
HISTFILE=~/.zhistfile
HISTSIZE=5000
SAVEHIST=1000000
WORDCHARS="${WORDCHARS:s#/#}"
# default programs
if [ `get_prop have_nvim` ]; then
export EDITOR=nvim
else
export EDITOR=vim
fi
export PAGER="less -FRX"
# .zlocal is a file of my creation - contains site-specific anything so I don't have to modify this
# file for every machine. If needed, default values go first so that the source call overwrites
# them.
PR_COLOR=$PR_BLUE
PR_CHAR='%#' # uid == 0 ? '%' : '#'
ssh_key_list=()
# Save these values so we can tell if they've been changed by zlocal.
typeset -A old_vals
old_vals["PROMPT"]=$PROMPT
if test ! -e ~/.zlocal; then
get-comfy
fi
if test -f ~/.zlocal; then
source ~/.zlocal
fi
####################################### }}}
# Line editor configuration. {{{
# The following lines were added by compinstall a very long time ago.
zstyle ':completion:*' completer _expand _complete _correct _approximate
zstyle ':completion:*' matcher-list ''
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle :compinstall filename '/home/ted/.zshrc'
autoload -U compinit; compinit
# autoload functions provided with zsh
autoload -U is-at-least
if is-at-least "4.2.0"; then
autoload -U url-quote-magic zmv
zle -N self-insert url-quote-magic
fi
# enable tetris - don't forget to bind it
autoload -U tetris
zle -N tetris
####################################### }}}
# Interface functions. {{{
battery_cornmeter() {
case `get_prop OS` in
'Linux')
BAT='/sys/class/power_supply/BAT1'
LEVEL=$((`cat $BAT/capacity` * 1.0))
grep -q '^Charging$' $BAT/status
CHARGING=$?
;;
'Ossix')
PMSET=`pmset -g batt`
LEVEL=`print $PMSET | perl -ne 'if (/(\d+)%/) { print $1; }'`
print $PMSET | grep -q 'AC Power'
CHARGING=$?
;;
esac
if [[ $CHARGING == 0 ]]; then
if [ `get_prop unicode` ]; then
CHRGCHR='⚡'
else
CHRGCHR='C'
fi
else
CHRHCHR=''
fi
cornmeter $LEVEL 100 "$CHRGCHR" 95 30
}
quota_cornmeter() {
local QUOTA_LEVEL=`cat "$QUOTA_FILE"`
local QUOTA_LEVEL_TEXT="`printf %.0f $QUOTA_LEVEL` GB"
if [[ $QUOTA_LEVEL -ge 9999 ]]; then
# basically infinity
QUOTA_LEVEL=$((4 * $QUOTA_CAP))
QUOTA_LEVEL_TEXT="∞ GB"
fi
cornmeter $QUOTA_LEVEL $QUOTA_CAP $QUOTA_LEVEL_TEXT 50 20
}
# If we're in a repo, print some info. Intended for use in a prompt. {{{
# Updates the variable that contains VCS info.
update_rprompt_vcs_status() {
if [ `get_prop have_git` ]; then
GIT=`git_status`
fi
_RPROMPT_VCS="$GIT"
}
git_status() {
local GITBRANCH=''
local GITSTATUS=''
local GITTXT='git'
local TIMEOUTTXT='<slow>'
if [ `get_prop unicode` ]; then
GITTXT='±'
TIMEOUTTXT='⌛'
fi
# This blocks the next prompt. If it takes a while just to check the branch,
# bail out.
if [ `get_prop have_timeout` ]; then
GITBRANCH=`timeout .5s git symbolic-ref HEAD 2>/dev/null`
else
GITBRANCH=`git symbolic-ref HEAD 2>/dev/null`
fi
case $? in
124)
# we timed out while trying to determine if we are in a git repo
print -n " $GITTXT:$TIMEOUTTXT"
return
;;
128)
# we are not in a git repo
return
;;
0)
# we are in a git repo
print -n " $GITTXT:${GITBRANCH#refs/heads/}"
if [ `get_prop have_timeout` ]; then
GITSTATUS=`timeout .20s git status`
else
GITSTATUS=`git status`
fi
if [[ $? == 124 ]]; then
# timeout
print -n $TIMEOUTTXT
return
fi
GITSTATUS=`print $GITSTATUS | grep -q "nothing to commit"`
if [[ $? == 0 ]]; then
# clean
return
else
# dirty
print -n "(*)"
return
fi
;;
esac
}
# }}}
# When on a laptop, enable cornmeter.
update_rprompt() {
local BOLD_ON BOLD_OFF DIR GIT COND_RETVAL BATTERY_METER QUOTA_METER
BOLD_ON='%B'
DIR=`print -P '%~'`
COND_RETVAL='%(?..{%?})'
if [ `get_prop have_battery` ]; then
BATTERY_METER=`battery_cornmeter`
fi
if [[ $QUOTA_FILE && $QUOTA_CAP ]]; then
QUOTA_METER=`quota_cornmeter`
fi
BOLD_OFF='%b'
RPROMPT="$PR_CYAN$BOLD_ON"["$DIR$_RPROMPT_VCS"]"$COND_RETVAL"
RPROMPT+="$BATTERY_METER$QUOTA_METER$BOLD_OFF"
}
# For terms known to support it, print some info to the terminal title.
case "$TERM" in
xterm*|screen*)
precmd_update_title() {
print -Pn "\e]0;%(!.--==.)%n@%m%(!.==--.) (%y)\a"
}
preexec_update_title() {
print -Pn "\e]0;%(!.--==.)%n@%m%(!.==--.) <%30>...>$1%<<> (%y)\a"
}
;;
esac
####################################### }}}
# Set up the interface. {{{
if [[ "$PROMPT" == "${old_vals["PROMPT"]}" ]]; then
PROMPT=$PR_COLOR"%B[%n@%m %D{%H:%M}]$PR_CHAR%b "
fi
PROMPT2=$PR_GREEN'%B%_>%b '
update_rprompt_vcs_status # update_rprompt will automatically do the rest.
SPROMPT=$PR_MAGENTA'zsh: correct '%R' to '%r'? '$PR_NO_COLOR
unset old_vals
precmd_functions=(precmd_update_title update_rprompt_vcs_status update_rprompt)
preexec_functions=(preexec_update_title)
# Automatically time long commands.
REPORTTIME=10
# Enable highlighting if it's installed.
HI_FILE=/usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
if [[ -e $HI_FILE ]]; then
source $HI_FILE
fi
#TODO: Check if we are a login shell. This could hang a script without that.
if [ `get_prop have_keychain` ]; then
keychain -Q -q ${ssh_key_list[@]}
source ~/.keychain/${HOST}-sh
fi
# Disable STOP/START for terminal output.
stty -ixon
####################################### }}}
# ZSH IS GO
#######################################