John Floren

Home | Blog | Tools

This page lists some tools I use for work. Mostly software, but there may be a few other things.

Unless I note otherwise, I run everything on Debian Linux.

Editor: acme

Yes, I forestall the inevitable emacs/vim battle by using a weird editor with... probably a few hundred users worldwide. I got used to it (eventually) back when I was using Plan 9, but luckily there's an excellent port in Plan 9 From Userspace which runs on Linux, the BSDs, and OS X.

The biggest reason I like acme is its buffer management. Emacs and vim users may split their display into two or three windows. In acme, I'll often have a dozen files, a few directory listings, a shell, my music player (more on that later), and the output buffers from a bunch of commands, all visible simultaneously, spread across 4 or 5 columns.

Above: An acme screenshot, click here for fullsize

You can write applications that run within acme. In practice it is similar to emacs, but the implementation is different. Emacs executes the lisp code of your applications within itself. Acme applications run as separate processes and interact with acme through reading/writing synthetic files over 9P. I've used a Go library which wraps all that to write my own mpd client program (see below).

Because I write Go code almost exclusively, there are a few tools I find especially useful within acme:

Window Manager: stumpwm

I use stumpwm as my window manager. It's written in Common Lisp which, frankly, hardly matters, but theoretically I can attach to it and make changes while it's running--which I've done once or twice over the course of years of use.

The main reasons I like stumpwm are:

Note Keeping

I've always got a notebook or legal pad on my desk, but for more structural / long-term notes, I ended up writing a tool in Go to keep track of notes. It's called "zk", for Zettelkasten, and also because "zk" is a short Unixy command name that doesn't conflict with anything else I know of.

zk is idiosyncratic and perhaps also idiotic. It's very much designed around the way I think, my own personal preferences and neuroses:

I interact with my notes using the `zk` command, but out of an abundance of optimism I have implemented the actual note manipulation logic in a Go library, meaning I could theoretically write a web frontend for it, or a GUI tool.

Terminal: urxvt

Although I often use a shell window within acme, I always have a bunch of urxvt windows open. I've got it set up to use the Terminus font at a relatively large size (high resolution monitors). For colors, I use the Solarized Light theme. I've also got it set up so I can click URLs within the terminal. All this is set via my .Xresources file (loaded with xrdb -merge ~/.Xresources in my .xsession):

URxvt*scrollTtyOutput: false
URxvt*scrollWithBuffer: true
URxvt*scrollTtyKeypress: true
URxvt*font: xft:terminus:size=24
URxvt*perl-ext-common: default,matcher,resize-font
URxvt*url-launcher: /usr/bin/x-www-browser
URxvt*matcher.button: 1
URxvt*background:   #dfdbc3
URxvt*foreground:   #593534
URxvt*color0:       #000000
URxvt*color1:       #990000
URxvt*color2:       #00a600
URxvt*color3:       #999900
URxvt*color4:       #0000b2
URxvt*color5:       #b200b2
URxvt*color6:       #00a6b2
URxvt*color7:       #bfbfbf
URxvt*color8:       #666666
URxvt*color9:       #e50000
URxvt*color10:      #00d900
URxvt*color11:      #e5e500
URxvt*color12:      #0000ff
URxvt*color13:      #e500e5
URxvt*color14:      #00e5e5
URxvt*color15:      #e5e5e5
URxvt*cursorColor:  #3a2322
URxvt*colorBD:      #7f2a19
URxvt*colorBDMode:  true

Music: mpd + custom acme client

My music is stored on a NAS, which I mount on my work computer. I then run a local MPD instance to handle indexing and playback. To control MPD, I wrote a program which runs within acme, which I call Ampd.

The primary goal of Ampd was to give me an unobtrusive way to see the current song, along with controls to pause and skip tracks. It also has some rudimentary searching and playlist building capabilities, but for the most part I just dump a big collection of tracks into an unnamed playlist and let it shuffle.