]>
Commit | Line | Data |
---|---|---|
1 | ### imports | |
2 | source ~/bin/.check-busybox | |
3 | ||
4 | ### options | |
5 | setopt NO_BEEP NO_CLOBBER | |
6 | ## cd | |
7 | setopt AUTO_CD CDABLE_VARS | |
8 | ## completion | |
9 | setopt GLOB_COMPLETE | |
10 | ## line | |
11 | setopt EXTENDED_GLOB GLOB_DOTS MARK_DIRS NOMATCH NUMERIC_GLOB_SORT | |
12 | ## prompt | |
13 | setopt PROMPT_SUBST | |
14 | ## jobs | |
15 | setopt AUTO_CONTINUE | |
16 | ## history | |
17 | setopt NO_HIST_SAVE_BY_COPY HIST_IGNORE_DUPS SHARE_HISTORY | |
18 | ||
19 | ### keys | |
20 | bindkey -v | |
21 | KEYTIMEOUT=1 | |
22 | ## xorg | |
23 | bindkey "^[[7~" beginning-of-line #Home | |
24 | bindkey -a "^[[7~" beginning-of-line | |
25 | bindkey "^[[8~" end-of-line #End | |
26 | bindkey -a "^[[8~" end-of-line | |
27 | bindkey "^[[3~" delete-char #Del | |
28 | bindkey -a "^[[3~" delete-char | |
29 | ## history search | |
30 | autoload -Uz up-line-or-beginning-search down-line-or-beginning-search && { | |
31 | if [[ -n "$key[Up]" ]] { | |
32 | zle -N up-line-or-beginning-search | |
33 | bindkey -- "$key[Up]" up-line-or-beginning-search | |
34 | } | |
35 | if [[ -n "$key[Down]" ]] { | |
36 | bindkey -- "$key[Down]" down-line-or-beginning-search | |
37 | zle -N down-line-or-beginning-search | |
38 | } | |
39 | } | |
40 | ||
41 | ### aliases | |
42 | alias h="history -25" | |
43 | alias j="jobs -l" | |
44 | alias l="ls -AF" | |
45 | alias e="${EDITOR:-vi}" # TODO: make sure vi is there or use safe default | |
46 | if [[ "$OSTYPE" =~ '^(free|net)bsd' ]] { | |
47 | alias ll="ls -lAFho" | |
48 | } else { | |
49 | alias ll="ls -lAFh" | |
50 | } | |
51 | alias se=sudoedit | |
52 | ## ps | |
53 | local p= | |
54 | if which pstree >/dev/null 2>&1 && ! check-busybox pstree; then | |
55 | # use pstree, but NOT busybox pstree because it kinda sucks | |
56 | p="pstree -wg3" | |
57 | elif [[ "$OSTYPE" =~ '^freebsd' ]]; then | |
58 | p="ps -aSdfxwwouser=USR -ogroup=GRP -opid,nice=NI \ | |
59 | -o%cpu,%mem,tty,stat,start=START -oetime,command" | |
60 | elif check-busybox ps; then | |
61 | # busybox compatible | |
62 | p="ps -eouser='USR ' -ogroup='GRP ' \ | |
63 | -opid=' PID' -onice=' NI' -ovsz=' MEM' \ | |
64 | -otty,stat,etime,comm" | |
65 | else | |
66 | # XXX: untested, posix | |
67 | # TODO: support gnu ps | |
68 | p="ps -eouser=USR -ogroup=GRP -opid,nice=NI \ | |
69 | -opcpu=CPU -ovsz=MEM -otty,stat,etime,comm" | |
70 | fi | |
71 | if [[ "$(basename "$PAGER")" = "less" ]] { | |
72 | p="$p | less -SE" | |
73 | } else { | |
74 | p="$p | \"${PAGER:-more}\"" | |
75 | } | |
76 | alias pa="$p" | |
77 | alias spa="sudo $p" | |
78 | unset p | |
79 | ## py venv | |
80 | alias va="source bin/activate" | |
81 | alias vd="deactivate" | |
82 | ## be paranoid | |
83 | alias cp='cp -ip' | |
84 | alias mv='mv -i' | |
85 | if [[ "$OSTYPE" =~ '^freebsd' ]] { | |
86 | # don't confirm if only a few files are deleted | |
87 | alias rm='rm -I' | |
88 | } else { | |
89 | # TODO: similar behavior for non-freebsd, or impliment in zsh | |
90 | alias rm='rm -i' | |
91 | } | |
92 | ## go up directories | |
93 | function up() { | |
94 | cd $(printf '../%.0s' {1..${1:-1}}) | |
95 | } | |
96 | ||
97 | ### hooks | |
98 | local _exectime= | |
99 | function precmd { | |
100 | # change terminal title | |
101 | # TODO: update and send BEL when job status changes | |
102 | print -Pn "\e]2;%(1j,%j,)%#${SSH_CLIENT+$USER@$HOST:}%~\e\\" | |
103 | # bell if exec takes 5s | |
104 | if ((SECONDS - _exectime >= 5)) print "\a" | |
105 | # we could update vcs_info here, but let prompt take care of it | |
106 | # if it doesn't use vcs, it can be ignored safely | |
107 | } | |
108 | function preexec { | |
109 | # change terminal title to show command | |
110 | print -Pnf "\e]2;%s\e\\" "%#${SSH_CLIENT+$USER@$HOST:}$1" | |
111 | # save last exec time for bell | |
112 | # XXX: does not run for blank cmdline | |
113 | _exectime=$SECONDS | |
114 | } | |
115 | function chpwd { | |
116 | # echo dir on cwd change | |
117 | l | |
118 | } | |
119 | ||
120 | ### system-specific configs and aliases | |
121 | case "$OSTYPE"; in | |
122 | freebsd*) | |
123 | ## vt binds | |
124 | bindkey "^[[H" beginning-of-line #Home | |
125 | bindkey -a "^[[H" beginning-of-line | |
126 | bindkey "^[[F" end-of-line #End | |
127 | bindkey -a "^[[F" end-of-line | |
128 | ||
129 | # colors | |
130 | export CLICOLOR= | |
131 | export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30' | |
132 | ||
133 | ## sound | |
134 | function s { sysctl hw.snd.default_unit${1:+\=$1} } | |
135 | alias vol mixer | |
136 | ||
137 | ## install port dependencies from pkg (like pkgsrc `bmake bin-install') | |
138 | #XXX: should probably use package-depends where possible, breaks when | |
139 | # port name is different to package name | |
140 | # (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc) | |
141 | function portpkg { | |
142 | case "$1" { | |
143 | build|run) | |
144 | sudo pkg install -AU $(make ${1}-depends-list | | |
145 | sed 's_/usr/ports/_ _' | tr -d '\n') | |
146 | ;; | |
147 | *) echo "Usage: \`portpkg <build|run>' in a port directory" | |
148 | return 1;; | |
149 | } | |
150 | };; | |
151 | netbsd) | |
152 | ## sound | |
153 | function s { | |
154 | if [[ -z "$1" ]] { | |
155 | ll /dev/mixer /dev/sound /dev/audio | |
156 | return | |
157 | } | |
158 | for x in mixer sound audio; do | |
159 | ln -sf /dev/$x"$1" /dev/$x | |
160 | done | |
161 | } | |
162 | function vol { | |
163 | if [[ -z "$1" ]] { | |
164 | for x in $(mixerctl -a | grep 'outputs\.master'); do | |
165 | echo $x | |
166 | done | |
167 | return | |
168 | } | |
169 | mixerctl -w outputs.master"$2"="$1" | |
170 | };; | |
171 | *) | |
172 | ## sound | |
173 | # TODO: test alsa/oss/sndio/portaudio/pulse in order of importance | |
174 | function s() {} | |
175 | function vol() {} | |
176 | esac | |
177 | ||
178 | ### modules & styles | |
179 | ## vcs | |
180 | zstyle ':vcs_info:*' enable git | |
181 | #zstyle ':vcs_info:git*' check-for-changes true #too slow | |
182 | zstyle ':vcs_info:git*:dotfiles' check-for-changes true | |
183 | zstyle ':vcs_info:git*' check-for-staged-changes true | |
184 | autoload -Uz vcs_info | |
185 | ||
186 | ## compinit | |
187 | zstyle ':completion:*' auto-description '[arg] %d' | |
188 | zstyle ':completion:*' expand suffix | |
189 | zstyle ':completion:*' format '# %d' | |
190 | zstyle ':completion:*' group-name '' | |
191 | zstyle ':completion:*' ignore-parents parent | |
192 | zstyle ':completion:*' insert-unambiguous false | |
193 | zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} | |
194 | zstyle ':completion:*' list-prompt '%B%i%b' | |
195 | zstyle ':completion:*' list-suffixes true | |
196 | zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*' | |
197 | zstyle ':completion:*' menu select=1 | |
198 | zstyle ':completion:*' original false | |
199 | zstyle ':completion:*' select-prompt '%B%l%b' | |
200 | zstyle ':completion:*' verbose true | |
201 | autoload -Uz compinit && compinit | |
202 | ||
203 | ## prompt | |
204 | # do this last so prompt can potentially override other settings | |
205 | autoload -Uz promptinit && promptinit | |
206 | prompt arrows | |
207 | ||
208 | ### load site-specific | |
209 | if [[ -f ~/.zshrc.local ]] { source ~/.zshrc.local } | |
210 | ||
211 | ### unset imports | |
212 | unfunction check-busybox | |
213 | ||
214 | # vim: set et sts=4 sw=4 ts=8 tw=79 : |