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 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 set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
56 set -A complete_got_1 -- \
87 Tweak the output of ls
91 reset(1) doesn't work as expected inside tmux: the old output can still
92 be consulted when scrolling. If I, lazy as I am, bother to type "reset"
93 I want to be sure that the history was cleared!
95 if [ -n "$TMUX" ]; then
96 alias reset='reset && tmux clear-history'
99 CDPATH is super useful! I even wrote a post about it:
100 https://www.omarpolo.com/post/enjoying-cdpath.html
102 export CDPATH=".:$HOME/w:/usr/ports:/usr/ports/mystuff:$HOME/quicklisp/local-projects"
104 I love to hate gpg! It needs some special treatments to work and this
105 should also (finger crossed!) fix pinentry over ssh. I'm not sure it
106 works though, it's been a while since I've connected remotely to my
109 export GPG_TTY=$(tty)
110 if [ -n "$SSH_CONNECTION" ]; then
111 export PINENTRY_USER_DATA="USE_CURSES=1"
114 The BSDs have this incredibly useful signal available, it's a shame not
119 I really like my prompt to be as minimal as possible. For some time
120 I've used a single colon `;' as prompt, it's really nice! At the moment
121 thought I'm usign a more plan9-esque percent sign:
125 I got tired of trying to remember the set of flags for nc to walk to
126 Gemini servers, so here we are:
128 # "post" stdin to the gemini server
129 # usage: gem host [port]
132 host="${1:?missing host}"
134 nc -c -Tnoverify "${host}" "${port}"
137 I think I've stolen these from someone. It makes a copy of the file and
138 launch an editor on the original file, incledibly useful when working
139 with ports (that's why doas!)
144 printf "%s\n" "USAGE: mgdiff file" >&2
147 doas cp -p "$1" "$1.orig"
151 hist is a quick wrapper around history and grep to quickly search for a
157 printf "%s\n" "USAGE: hist pattern" >&2
160 history 0 | grep "$1"
163 clbin (the site) is a web pastebin that's easy to use from the command
164 line with curl. clbin (the function) is an easy way to share something,
165 just pipe it to clbin and it returns an url.
169 curl -F 'clbin=<-' https://clbin.com
172 Some aliases I use when working with the OpenBSD port tree:
175 alias mup="make update-patches"
176 alias mupl="make update-plist"
177 alias mpldc="make port-lib-depends-check"
178 alias build="MAKE_JOBS=5 time make 2>&1 | tee build"
179 alias pclean='make clean="package plist"'
181 And even more aliases:
183 alias mopnew="mdirs ~/Maildir/op | grep -v emacs | mlist -st | mthread -r | mseq -S"
185 for c in com rep fwd bnc; do
186 alias o$c="m$c -from 'Omar Polo <op@openbsd.org>'"
189 find(1) is an invaluable tool and I use it all the time. walk is an
190 attempt to build a wrapper around some common usages of find that is a
191 little bit less verbose to use. The name is stolen from 9front, but the
192 implementation is completely different.
194 # usage: walk [dir] [type] [name regexp] [! command to execute]
197 if [ $# -eq 0 ]; then
206 if [ -n "$1" -a -d "$1" ]; then
217 if [ -n "$1" -a "x$1" != "x!" ]; then
222 if [ "x$1" = x! ]; then
226 if [ $# -eq 0 ]; then
227 find "$dir" $type -iname "$name"
229 find "$dir" $type -iname "$name" -exec "$@" {} +