---
title: Making Unix a little more Plan9-like
description: How to make your X11 stuff feel more like Plan9
section: computing
---

I'm not really interested in defending anything.
I tried out plan9port and liked it,
but I have to live in Unix land.
Here's how I set that up.

A Warning
--------

The suckless community,
and some of the plan9 communities,
are dominated by jackasses.
I hope that's strong enough wording to impress the severity.
Don't go into IRC for help.
Stay off the suckless email list.
The software is great,
the people who write it are well-spoken and well-reasoned,
but for some reason the fandom is horrible to everyone.

xterm
-----

9term has some really cool ideas.
But Unix has a long history of using graphical terminals,
and lots of stuff needs VT220 compatibility.
xterm is a good compromise.

You can make the xterm scroll bar (and all other Athena scrollbars) prettier
with this in your X resources:

	*Scrollbar.thickness: 10
	*Scrollbar.thumb: None
	*Scrollbar.foreground: gray80
	*Scrollbar.background: gray50
	*Scrollbar.borderWidth: 3
	*ScrollBarBorder: 0

This will swap the left and right mouse buttons,
to work like acme and 9term:

	*Scrollbar.translations: #override\
		<Btn1Down>: StartScroll(Backward) \n\
		<Btn3Down>: StartScroll(Forward) \n\
		<BtnUp>: NotifyScroll(Proportional) EndScroll()

A side note:
if xrdb is never run and your root window doesn't have a
`RESOURCE_MANAGER` property set,
libXaw will read `$HOME/.Xdefaults`.
This is supposedly deprecated,
but Xaw is so ancient it will probably never be removed.


9wm
----

I'm now maintaining the 9wm window manager.
If you like rio you should give it a whirl,
there are some differences you might prefer.
https://github.com/9wm/9wm


sshfs
-----

As a non-root user,
you can mount remote file systems locally with `sshfs`.
It's probably as close as Unix is going to get for a while,
and it's not awful.


lm
--

The plan9 `lm` command is great:
it's like `apropos` or `man -k` but it outputs lines you can
copy and paste into a prompt to pull up the page.
Here's a script to do the same thing with Unix:

	#! /bin/sh
	apropos -l "$@" | sed 's/\(.*\) (\(.*\)) * - /man \2 \1 # /'


xdg-open
--------

This is the current Linux notion of how to do things like the plumber.
Just about every modern program calls out to it to open files,
and it uses whichever one is first in your path,
so you can make a little script to do what you want and
avoid having to configure all the weirdo files in ~/.config

	#! /bin/sh
	case "$1" in
		*://*)
			exec web "$1"
			;;
		*.pdf)
			exec my-pdf-viewer "$1"
			;;
	esac


mon
---

Russ Cox uses a program called `mon`
to watch files and run them whenever they change.
This is pretty handy for iterative debugging,
you don't have to keep re-running your program every time you
save/compile.

Here's a start at one.
It can be improved.

	#! /bin/sh
	while true; do
		gonow=
		stat=$(stat --format=%Y.%Z.%s $1)
		if [ "$stat" != "${laststat:-$stat}" ]; then
			laststat=$stat
			gonow=yes
		fi

		if [ -n "$gonow" ]; then
			echo "[[=== start ===]]"
			$@
			echo "[[=== done ===]]"
		fi
		laststat=$stat
		sleep 1
	done


