Blob


1 # ksh
3 OpenBSD ksh (sometimes called opdksh or oksh) is the default shell on
4 OpenBSD, and is generally my go-to choince on other systems too. It has
5 a good ratio of features and simplicity
7 if [ "$TERM" = dumb ]; then
8 PS1='$ '
9 return
10 fi
12 Enable emacs-like command editing regardless of $EDITOR and csh-like
13 history expansion with !
15 set -o emacs
16 set -o csh-history
18 Talking about history, by default ksh won't store any, which is
19 unfortunate. I can't live without my C-r working!
21 HISTCONTROL=ignoredups:ignorespace
22 HISTFILE=$HOME/.history
23 HISTSIZE=10000
25 OpenBSD ksh has a limited support for programmed completions through
26 static lists. The completions are provided via an array called
27 complete_$progname; or complete_$progname_$nth for the nth argument.
29 Here's the completions for ssh and scp:
31 HOST_LIST=$(awk '/Host / {print $2}' ~/.ssh/config | xargs echo)
33 set -A complete_ssh -- $HOST_LIST
34 set -A complete_scp -- $HOST_LIST
36 and for kill(1) and pkill(1)
38 set -A complete_kill_1 -- -9 -HUP -INFO -KILL -TERM
39 set -A complete_pkill_2 -- -SIGHUP -SIGUSR1 -SIGUSR2 -SIGTERM -SIGKILL
41 and for vmd(8) if available
43 if test -f /usr/sbin/vmd && pgrep -fq /usr/sbin/vmd; then
44 set -A complete_vmctl_1 -- console load reload start stop \
45 reset status send receive
46 set -A complete_vmctl -- \
47 $(vmctl status | awk '!/NAME/{printf "%s ", $NF}')
48 fi
50 and for ifconfig(8)
52 command -v ifconfig >/dev/null && \
53 set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
55 and for got(1)
57 command -v got >/dev/null && \
58 set -A complete_got_1 -- $(got -h 2>&1 | sed -n s/commands://p)
60 Tweak the output of ls
62 alias ls='ls -F'
64 Provide an easiest access to amused
66 alias a=amused
68 reset(1) doesn't work as expected inside tmux: the old output can still
69 be consulted when scrolling. If I, lazy as I am, bother to type "reset"
70 I want to be sure that the history was cleared!
72 if [ -n "$TMUX" ]; then
73 alias reset='reset && tmux clear-history'
74 fi
76 CDPATH is super useful! I even wrote a post about it:
77 https://www.omarpolo.com/post/enjoying-cdpath.html
79 export CDPATH=".:$HOME/w:/usr/ports:/usr/ports/mystuff:$HOME/quicklisp/local-projects"
81 I love to hate gpg! It needs some special treatments to work and this
82 should also (finger crossed!) fix pinentry over ssh. I'm not sure it
83 works though, it's been a while since I've connected remotely to my
84 desktop.
86 export GPG_TTY=$(tty)
87 if [ -n "$SSH_CONNECTION" ]; then
88 export PINENTRY_USER_DATA="USE_CURSES=1"
89 fi
91 The BSDs have this incredibly useful signal available, it's a shame not
92 to use it!
94 case "$(uname)" in
95 *BSD) stty status ^T ;;
96 esac
98 I really like my prompt to be as minimal as possible. For some time
99 I've used a single colon `;' as prompt, it's really nice! At the moment
100 thought I'm usign a more plan9-esque percent sign, with an optional
101 hostname:
103 if [ "$(hostname)" = venera ]; then
104 PS1='% '
105 else
106 PS1='\h% '
107 fi
109 I got tired of trying to remember the set of flags for nc to walk to
110 Gemini servers, so here we are:
112 # "post" stdin to the gemini server
113 # usage: gem host [port]
114 gem()
116 host="${1:?missing host}"
117 port="${2:-1965}"
118 nc -c -Tnoverify "${host}" "${port}"
121 I think I've stolen these from someone. It makes a copy of the file and
122 launch an editor on the original file, incledibly useful when working
123 with ports (that's why doas!)
125 mgdiff()
127 if [ -z "$1" ]; then
128 printf "%s\n" "USAGE: mgdiff file" >&2
129 return
130 fi
131 doas cp -p "$1" "$1.orig"
132 doas mg "$1"
135 hist is a quick wrapper around history and grep to quickly search for a
136 previous command:
138 hist()
140 if [ -z "$1" ]; then
141 printf "%s\n" "USAGE: hist pattern" >&2
142 return 1
143 fi
144 history 0 | grep "$1"
147 clbin (the site) is a web pastebin that's easy to use from the command
148 line with curl. clbin (the function) is an easy way to share something,
149 just pipe it to clbin and it returns an url.
151 clbin()
153 curl -F 'clbin=<-' https://clbin.com
156 Some aliases I use when working with the OpenBSD port tree:
158 alias m="make"
159 alias mup="make update-patches"
160 alias mupl="make update-plist"
161 alias mpldc="make port-lib-depends-check"
162 alias pbuild="env MAKE_JOBS=5 time make"
163 alias build="pbuild 2>&1 | tee build"
164 alias pclean='make clean="package plist"'
166 This one is pretty sophisticated, I've stolen it from jca@
168 # check shared libs version
169 cshlib() {
170 local cnt=0
171 local f
173 for f in $(make show=SHARED_LIBS); do
174 [ "$((cnt++ % 2))" -eq 1 ] && continue
175 echo '===>' $f
176 /usr/src/lib/check_sym /usr/local/lib/lib$f.so* \
177 $(make show=WRKINST)/usr/local/lib/lib$f.so*
178 done
181 And even more aliases:
183 alias mopnew="mdirs ~/Maildir/op | grep -v rss | mlist -st | mthread -r | mseq -S; mscan"
185 for c in com rep fwd bnc; do
186 local _mvisual='mg -f auto-fill-mode'
187 if [ -n "$DISPLAY" ]; then
188 _mvisual='emacsclient -c'
189 fi
191 alias m$c="VISUAL='$_mvisual' m$c"
192 alias o$c="m$c -from 'Omar Polo <op@openbsd.org>'"
193 done
195 And finally some aliases for mq
197 alias pnq="NQDIR=/tmp/ports/ nq "
198 alias pfq="NQDIR=/tmp/ports/ fq "
200 Stuff to use my own purritobin instance
202 : ${P_SERVER=paste.omarpolo.com}
203 : ${P_PORT=42069}
204 : ${P_TIME=week}
205 : ${P_MAXTIME=30}
207 shell client to upload a plaintext message
209 purr() {
210 curl --silent --max-time "${P_MAXTIME}" \
211 --data-binary "@${1:-/dev/stdin}" \
212 "${P_SERVER}:${P_PORT}/${P_TIME}"
215 shell client to upload an encrypted message
217 meow() {
218 key="$(openssl rand -hex 32)"
219 iv="$(openssl rand -hex 16)"
220 url="$(openssl enc -aes-256-cbc -K ${key} -iv ${iv} -e -base64 -A < ${1:-/dev/stdin} | purr)"
221 printf "%s\n" "${url%\/*}/paste.html#${url##*\/}_${key}_${iv}"
222 unset key iv url
225 ...and to decrypt it
227 meowd() {
228 url="$1"
229 baseurl="${url%\/*}"
230 vals="${url##*\#}"
231 paste=$(printf '%s\n' "${vals}" | cut -d_ -f1)
232 key=$(printf '%s\n' "${vals}" | cut -d _ -f2)
233 iv=$(printf '%s\n' "${vals}" | cut -d _ -f3)
234 curl --max-time "${P_MAXTIME}" --write-out "\n" --silent \
235 "${baseurl}/${paste}" | openssl enc -aes-256-cbc \
236 -base64 -d -K ${key} -iv ${iv}
237 unset url baseurl vals paste key iv
240 llama is also nice. It's possible to use it to cd too!
242 ll() {
243 cd "$(llama "$@")"
246 For extra-comfyness bind it to C-o
248 bind -m '^O=^U ll^M^Y'
250 find(1) is an invaluable tool and I use it all the time. walk is an
251 attempt to build a wrapper around some common usages of find that is a
252 little bit less verbose to use. The name is stolen from 9front, but the
253 implementation is completely different.
255 # usage: walk [dir] [type] [name regexp] [! command to execute]
256 walk()
258 if [ $# -eq 0 ]; then
259 find .
260 return
261 fi
263 local dir=.
264 local type=
265 local name=\*
267 if [ -n "$1" -a -d "$1" ]; then
268 dir="$1"
269 shift
270 fi
272 case "$1" in
273 b|c|d|f|l|p|s)
274 type="-type $1"
275 shift
276 esac
278 if [ -n "$1" -a "x$1" != "x!" ]; then
279 name="$1"
280 shift
281 fi
283 if [ "x$1" = x! ]; then
284 shift
285 fi
287 if [ $# -eq 0 ]; then
288 find "$dir" $type -iname "$name"
289 else
290 find "$dir" $type -iname "$name" -exec "$@" {} +
291 fi