Nile is an alternative window manager for Plan 9. It offers easier window creation, dramatically simplifies the menus, offers a (nearly) menuless mode (which is how I always use it), incorporates the scrolling behavior from 9term and acme from Plan 9 from User Space, and makes a few other (mostly cosmetic) changes. I've been using some version of it since 2013 and find it very comfortable, and parts of it a distinct improvement.
The impetus for this was finding a message from Russ Cox on 9fans, already about 8 years old when I (re-)read it. I had done several hacked-up experiments with rio at that point, and what he was describing sounded both easy to implement (for the most part) and a like it would probably be a significan functional improviement. So I put it together: nile.tgz.
There is an updated man page, but here are the differences from rio.
Rather than rio's New menu item, in nile you sweep out a new window with button 3 by starting anywhere on the background. This is probably the most satisfying single change.
By default, nile offers significantly simplified menus. Cut, paste, and snarf are gone from the button 2 menu, as they're redundant with the mouse chords, which are both more convienent and more powerful. New, Resize, and Move are gone from the button 3 menu; the new method for creating windows is described above, and Resize and Move have always been redundant with grabbing the window borders. The Exit menu, previously only available if the executable name ended with ".out", is now always available.
The list of hidden windows is now revealed by pressing button 1 on the background.
There is a "look" menu item now, but the implementation is not finished. It is currently a no-op.
When invoked with -m nile runs in "menuless" mode. The button 2 and button 3 menus are gone; button 2 inside a window always sends to the current window and button 3 inside a window always means "plumb".
The only old menu items which have not been replaced by the button functionality are Delete and Hide. I have simple helper script, "Hide", which will hide the window it is run from (I leave this in the top tag of my acme window, for example). I also have a modified version of winwatch which puts these on a menu there.
This mode is not quite genuinely menuless: the menu of hidden windows is still available on button 1.
This feels very nice. I run with -m constantly, and should probably make it the default.
We remove rio's scroll/noscroll modes and instead scroll when the write begins in or immediately after the displayed window content. The most common cases are handled more naturally, and explicitly pausing scrolling is as easy as scrolling up once, and restoring it just jumping to the bottom of the window.
Plan 9 from User Space made this change in 2011 and, after a (surprisingly brief) transition period, it has felt much more comfortable than managing the scroll mode explicitly. See the commit on the plan9port mailing list for more.
Nile includes Andrey Mirtchovski's patch to enable transparent window creation. That is, when creating or resizing windows, only the border is displayed. This is nicer when doing graphics over a poor network, and makes a difference for cpu load on tiny things like older Raspberry pi.
When invoked with -I, nile runs in a "non-interactive" mode. There are no menus and windows have no borders. The idea is to also invoke nile with -i initprog and have that program create some windows, which will then be statically positioned.
I used this for a while on smaller devices, where initprog would start up faces and winwatch, and then several other programs (acme, a regular rio, a shell window, a mail reader) all in the same space. Then winwatch functions as a sort of workspace switcher. It was nice on smaller devices, but feels like a waste on larger screens.
Nile uses a darker color scheme than rio. The background is darker, windows have white text on a black background, and hold and highlight colors have been adjusted to suit.
This has worked out okay, but isn't great. I'd say it's an overall improvement in dimly-lit rooms, but a bigger loss in bright environments.
Window borders and the scroll bar are slightly narrower, and the minimum window size is much smaller (see nile.c:/^sweep, nile.c:/^bandsize, and wctl.c:/^goodrect).
Prints of "rio" have been changed to "nile", but I've put off renaming all the pre-existing internal structures. This makes diffs much easier to read. Until very recently, this also allowed including fsys.c, scrl.c, time.c, and util.c, which are unmodified from rio, directly the system versions (this is no longer done to make building on 9front easier).
In particular, the files in /srv still have "rio" in the names.
The code is known not to compile as-is on 9front, due to drift in that fork's definitions of Kscrolloneup and Kscrollonedown. I am told that commenting out lines 25-29 of dat.h (the enum that defines those) resolves the issue there.
Grab nile.tgz and unpack it:
gunzip < nile.tgz | tar -x
It'll make a nile
directory; run mk
in there.
Check the mkfile and make sure BIN
is set sensibly,
then run mk install
.