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
12 Enable emacs-like command editing regardless of $EDITOR and csh-like
13 history expansion with !
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
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}')
52 command -v ifconfig >/dev/null && \
53 set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
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
64 Provide an easiest access to 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'
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
87 if [ -n "$SSH_CONNECTION" ]; then
88 export PINENTRY_USER_DATA="USE_CURSES=1"
91 The BSDs have this incredibly useful signal available, it's a shame not
95 *BSD) stty status ^T ;;
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
103 if [ "$(hostname)" = venera ]; then
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]
116 host="${1:?missing host}"
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!)
128 printf "%s\n" "USAGE: mgdiff file" >&2
131 doas cp -p "$1" "$1.orig"
135 hist is a quick wrapper around history and grep to quickly search for a
141 printf "%s\n" "USAGE: hist pattern" >&2
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.
153 curl -F 'clbin=<-' https://clbin.com
156 Some aliases I use when working with the OpenBSD port tree:
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
173 for f in $(make show=SHARED_LIBS); do
174 [ "$((cnt++ % 2))" -eq 1 ] && continue
176 /usr/src/lib/check_sym /usr/local/lib/lib$f.so* \
177 $(make show=WRKINST)/usr/local/lib/lib$f.so*
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'
191 alias m$c="VISUAL='$_mvisual' m$c"
192 alias o$c="m$c -from 'Omar Polo <op@openbsd.org>'"
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}
207 shell client to upload a plaintext message
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
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}"
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!
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]
258 if [ $# -eq 0 ]; then
267 if [ -n "$1" -a -d "$1" ]; then
278 if [ -n "$1" -a "x$1" != "x!" ]; then
283 if [ "x$1" = x! ]; then
287 if [ $# -eq 0 ]; then
288 find "$dir" $type -iname "$name"
290 find "$dir" $type -iname "$name" -exec "$@" {} +