Blame


1 7b4d8efb 2022-02-04 op # ksh
2 7b4d8efb 2022-02-04 op
3 7b4d8efb 2022-02-04 op OpenBSD ksh (sometimes called opdksh or oksh) is the default shell on
4 7b4d8efb 2022-02-04 op OpenBSD, and is generally my go-to choince on other systems too. It has
5 7b4d8efb 2022-02-04 op a good ratio of features and simplicity
6 7b4d8efb 2022-02-04 op
7 7b4d8efb 2022-02-04 op if [ "$TERM" = dumb ]; then
8 7b4d8efb 2022-02-04 op PS1='$ '
9 7b4d8efb 2022-02-04 op return
10 7b4d8efb 2022-02-04 op fi
11 7b4d8efb 2022-02-04 op
12 7b4d8efb 2022-02-04 op Enable emacs-like command editing regardless of $EDITOR and csh-like
13 7b4d8efb 2022-02-04 op history expansion with !
14 7b4d8efb 2022-02-04 op
15 7b4d8efb 2022-02-04 op set -o emacs
16 7b4d8efb 2022-02-04 op set -o csh-history
17 7b4d8efb 2022-02-04 op
18 7b4d8efb 2022-02-04 op Talking about history, by default ksh won't store any, which is
19 7b4d8efb 2022-02-04 op unfortunate. I can't live without my C-r working!
20 7b4d8efb 2022-02-04 op
21 7b4d8efb 2022-02-04 op HISTCONTROL=ignoredups:ignorespace
22 7b4d8efb 2022-02-04 op HISTFILE=$HOME/.history
23 7b4d8efb 2022-02-04 op HISTSIZE=10000
24 7b4d8efb 2022-02-04 op
25 7b4d8efb 2022-02-04 op OpenBSD ksh has a limited support for programmed completions through
26 7b4d8efb 2022-02-04 op static lists. The completions are provided via an array called
27 7b4d8efb 2022-02-04 op complete_$progname; or complete_$progname_$nth for the nth argument.
28 7b4d8efb 2022-02-04 op
29 7b4d8efb 2022-02-04 op Here's the completions for ssh and scp:
30 7b4d8efb 2022-02-04 op
31 7b4d8efb 2022-02-04 op HOST_LIST=$(awk '/Host / {print $2}' ~/.ssh/config | xargs echo)
32 7b4d8efb 2022-02-04 op
33 7b4d8efb 2022-02-04 op set -A complete_ssh -- $HOST_LIST
34 7b4d8efb 2022-02-04 op set -A complete_scp -- $HOST_LIST
35 7b4d8efb 2022-02-04 op
36 7b4d8efb 2022-02-04 op and for kill(1) and pkill(1)
37 7b4d8efb 2022-02-04 op
38 7b4d8efb 2022-02-04 op set -A complete_kill_1 -- -9 -HUP -INFO -KILL -TERM
39 7b4d8efb 2022-02-04 op set -A complete_pkill_2 -- -SIGHUP -SIGUSR1 -SIGUSR2 -SIGTERM -SIGKILL
40 7b4d8efb 2022-02-04 op
41 7b4d8efb 2022-02-04 op and for vmd(8) if available
42 7b4d8efb 2022-02-04 op
43 7b4d8efb 2022-02-04 op if pgrep -fq /usr/sbin/vmd; then
44 7b4d8efb 2022-02-04 op set -A complete_vmctl_1 -- console load reload start stop \
45 7b4d8efb 2022-02-04 op reset status send receive
46 7b4d8efb 2022-02-04 op set -A complete_vmctl -- \
47 7b4d8efb 2022-02-04 op $(vmctl status | awk '!/NAME/{printf "%s ", $NF}')
48 7b4d8efb 2022-02-04 op fi
49 7b4d8efb 2022-02-04 op
50 7b4d8efb 2022-02-04 op and for ifconfig(8)
51 7b4d8efb 2022-02-04 op
52 7b4d8efb 2022-02-04 op set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
53 7b4d8efb 2022-02-04 op
54 7b4d8efb 2022-02-04 op and for got(1)
55 7b4d8efb 2022-02-04 op
56 7b4d8efb 2022-02-04 op set -A complete_got_1 -- \
57 7b4d8efb 2022-02-04 op init \
58 7b4d8efb 2022-02-04 op import im \
59 7b4d8efb 2022-02-04 op clone cl \
60 7b4d8efb 2022-02-04 op fetch fe \
61 7b4d8efb 2022-02-04 op checkout co \
62 7b4d8efb 2022-02-04 op update up \
63 7b4d8efb 2022-02-04 op status st \
64 7b4d8efb 2022-02-04 op log \
65 7b4d8efb 2022-02-04 op diff di \
66 7b4d8efb 2022-02-04 op blame bl \
67 7b4d8efb 2022-02-04 op tree tr \
68 7b4d8efb 2022-02-04 op ref \
69 7b4d8efb 2022-02-04 op branch br \
70 7b4d8efb 2022-02-04 op tag \
71 7b4d8efb 2022-02-04 op add \
72 7b4d8efb 2022-02-04 op remove rm \
73 7b4d8efb 2022-02-04 op revert rv \
74 7b4d8efb 2022-02-04 op commit ci \
75 7b4d8efb 2022-02-04 op send se \
76 7b4d8efb 2022-02-04 op cherrypick cy \
77 7b4d8efb 2022-02-04 op backout bo \
78 7b4d8efb 2022-02-04 op rebase rb \
79 7b4d8efb 2022-02-04 op histedit he \
80 7b4d8efb 2022-02-04 op integrate ig \
81 7b4d8efb 2022-02-04 op merge mg \
82 7b4d8efb 2022-02-04 op stage sg \
83 7b4d8efb 2022-02-04 op unstage ug \
84 7b4d8efb 2022-02-04 op cat \
85 7b4d8efb 2022-02-04 op info
86 7b4d8efb 2022-02-04 op
87 7b4d8efb 2022-02-04 op Tweak the output of ls
88 7b4d8efb 2022-02-04 op
89 7b4d8efb 2022-02-04 op alias ls='ls -F'
90 7b4d8efb 2022-02-04 op
91 7b4d8efb 2022-02-04 op reset(1) doesn't work as expected inside tmux: the old output can still
92 7b4d8efb 2022-02-04 op be consulted when scrolling. If I, lazy as I am, bother to type "reset"
93 7b4d8efb 2022-02-04 op I want to be sure that the history was cleared!
94 7b4d8efb 2022-02-04 op
95 7b4d8efb 2022-02-04 op if [ -n "$TMUX" ]; then
96 7b4d8efb 2022-02-04 op alias reset='reset && tmux clear-history'
97 7b4d8efb 2022-02-04 op fi
98 7b4d8efb 2022-02-04 op
99 7b4d8efb 2022-02-04 op CDPATH is super useful! I even wrote a post about it:
100 7b4d8efb 2022-02-04 op https://www.omarpolo.com/post/enjoying-cdpath.html
101 7b4d8efb 2022-02-04 op
102 7b4d8efb 2022-02-04 op export CDPATH=".:$HOME/w:/usr/ports:/usr/ports/mystuff:$HOME/quicklisp/local-projects"
103 7b4d8efb 2022-02-04 op
104 7b4d8efb 2022-02-04 op I love to hate gpg! It needs some special treatments to work and this
105 7b4d8efb 2022-02-04 op should also (finger crossed!) fix pinentry over ssh. I'm not sure it
106 7b4d8efb 2022-02-04 op works though, it's been a while since I've connected remotely to my
107 7b4d8efb 2022-02-04 op desktop.
108 7b4d8efb 2022-02-04 op
109 7b4d8efb 2022-02-04 op export GPG_TTY=$(tty)
110 7b4d8efb 2022-02-04 op if [ -n "$SSH_CONNECTION" ]; then
111 7b4d8efb 2022-02-04 op export PINENTRY_USER_DATA="USE_CURSES=1"
112 7b4d8efb 2022-02-04 op fi
113 7b4d8efb 2022-02-04 op
114 7b4d8efb 2022-02-04 op The BSDs have this incredibly useful signal available, it's a shame not
115 7b4d8efb 2022-02-04 op to use it!
116 7b4d8efb 2022-02-04 op
117 7b4d8efb 2022-02-04 op stty status ^T
118 7b4d8efb 2022-02-04 op
119 7b4d8efb 2022-02-04 op I really like my prompt to be as minimal as possible. For some time
120 7b4d8efb 2022-02-04 op I've used a single colon `;' as prompt, it's really nice! At the moment
121 7b4d8efb 2022-02-04 op thought I'm usign a more plan9-esque percent sign:
122 7b4d8efb 2022-02-04 op
123 7b4d8efb 2022-02-04 op PS1='% '
124 7b4d8efb 2022-02-04 op
125 7b4d8efb 2022-02-04 op I got tired of trying to remember the set of flags for nc to walk to
126 7b4d8efb 2022-02-04 op Gemini servers, so here we are:
127 7b4d8efb 2022-02-04 op
128 7b4d8efb 2022-02-04 op # "post" stdin to the gemini server
129 7b4d8efb 2022-02-04 op # usage: gem host [port]
130 7b4d8efb 2022-02-04 op gem()
131 7b4d8efb 2022-02-04 op {
132 7b4d8efb 2022-02-04 op host="${1:?missing host}"
133 7b4d8efb 2022-02-04 op port="${2:-1965}"
134 7b4d8efb 2022-02-04 op nc -c -Tnoverify "${host}" "${port}"
135 7b4d8efb 2022-02-04 op }
136 7b4d8efb 2022-02-04 op
137 7b4d8efb 2022-02-04 op I think I've stolen these from someone. It makes a copy of the file and
138 7b4d8efb 2022-02-04 op launch an editor on the original file, incledibly useful when working
139 7b4d8efb 2022-02-04 op with ports (that's why doas!)
140 7b4d8efb 2022-02-04 op
141 7b4d8efb 2022-02-04 op mgdiff()
142 7b4d8efb 2022-02-04 op {
143 7b4d8efb 2022-02-04 op if [ -z "$1" ]; then
144 7b4d8efb 2022-02-04 op printf "%s\n" "USAGE: mgdiff file" >&2
145 7b4d8efb 2022-02-04 op return
146 7b4d8efb 2022-02-04 op fi
147 7b4d8efb 2022-02-04 op doas cp -p "$1" "$1.orig"
148 7b4d8efb 2022-02-04 op doas mg "$1"
149 7b4d8efb 2022-02-04 op }
150 7b4d8efb 2022-02-04 op
151 7b4d8efb 2022-02-04 op hist is a quick wrapper around history and grep to quickly search for a
152 7b4d8efb 2022-02-04 op previous command:
153 7b4d8efb 2022-02-04 op
154 7b4d8efb 2022-02-04 op hist()
155 7b4d8efb 2022-02-04 op {
156 7b4d8efb 2022-02-04 op if [ -z "$1" ]; then
157 7b4d8efb 2022-02-04 op printf "%s\n" "USAGE: hist pattern" >&2
158 7b4d8efb 2022-02-04 op return 1
159 7b4d8efb 2022-02-04 op fi
160 7b4d8efb 2022-02-04 op history 0 | grep "$1"
161 7b4d8efb 2022-02-04 op }
162 7b4d8efb 2022-02-04 op
163 7b4d8efb 2022-02-04 op Some aliases I use when working with the OpenBSD port tree:
164 7b4d8efb 2022-02-04 op
165 7b4d8efb 2022-02-04 op alias m="make"
166 7b4d8efb 2022-02-04 op alias mup="make update-patches"
167 7b4d8efb 2022-02-04 op alias mupl="make update-plist"
168 7b4d8efb 2022-02-04 op alias build="MAKE_JOBS=5 time make 2>&1 | tee build"
169 7b4d8efb 2022-02-04 op alias pclear='make clean="package plist"'
170 7b4d8efb 2022-02-04 op
171 7b4d8efb 2022-02-04 op find(1) is an invaluable tool and I use it all the time. walk is an
172 7b4d8efb 2022-02-04 op attempt to build a wrapper around some common usages of find that is a
173 7b4d8efb 2022-02-04 op little bit less verbose to use. The name is stolen from 9front, but the
174 7b4d8efb 2022-02-04 op implementation is completely different.
175 7b4d8efb 2022-02-04 op
176 7b4d8efb 2022-02-04 op # usage: walk [dir] [type] [name regexp] [! command to execute]
177 7b4d8efb 2022-02-04 op walk()
178 7b4d8efb 2022-02-04 op {
179 7b4d8efb 2022-02-04 op if [ $# -eq 0 ]; then
180 7b4d8efb 2022-02-04 op find .
181 7b4d8efb 2022-02-04 op return
182 7b4d8efb 2022-02-04 op fi
183 7b4d8efb 2022-02-04 op
184 7b4d8efb 2022-02-04 op local dir=.
185 7b4d8efb 2022-02-04 op local type=
186 7b4d8efb 2022-02-04 op local name=\*
187 7b4d8efb 2022-02-04 op
188 7b4d8efb 2022-02-04 op if [ -n "$1" -a -d "$1" ]; then
189 7b4d8efb 2022-02-04 op dir="$1"
190 7b4d8efb 2022-02-04 op shift
191 7b4d8efb 2022-02-04 op fi
192 7b4d8efb 2022-02-04 op
193 7b4d8efb 2022-02-04 op case "$1" in
194 7b4d8efb 2022-02-04 op b|c|d|f|l|p|s)
195 7b4d8efb 2022-02-04 op type="-type $1"
196 7b4d8efb 2022-02-04 op shift
197 7b4d8efb 2022-02-04 op esac
198 7b4d8efb 2022-02-04 op
199 7b4d8efb 2022-02-04 op if [ -n "$1" -a "x$1" != "x!" ]; then
200 7b4d8efb 2022-02-04 op name="$1"
201 7b4d8efb 2022-02-04 op shift
202 7b4d8efb 2022-02-04 op fi
203 7b4d8efb 2022-02-04 op
204 7b4d8efb 2022-02-04 op if [ "x$1" = x! ]; then
205 7b4d8efb 2022-02-04 op shift
206 7b4d8efb 2022-02-04 op fi
207 7b4d8efb 2022-02-04 op
208 7b4d8efb 2022-02-04 op if [ $# -eq 0 ]; then
209 7b4d8efb 2022-02-04 op find "$dir" $type -iname "$name"
210 7b4d8efb 2022-02-04 op else
211 7b4d8efb 2022-02-04 op find "$dir" $type -iname "$name" -exec "$@" {} +
212 7b4d8efb 2022-02-04 op fi
213 7b4d8efb 2022-02-04 op }