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.
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:
- Go tools for acme, a.k.a. "A", is something I use constantly. It provides a variety of tools for analyzing Go code within acme. 99% of the time, I just use the def command: I click on a function call and execute "A def" from the buffer title bar, which then opens the file containing the definition at the appropriate point. It works for functions, structs, consts, etc.
- acmego automatically formats Go source files when you save. It also adds or removes package imports as needed, which is hugely convenient.
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:
- It's a tiling window manager. My screens tend to get over-cluttered with floating window managers.
- It tiles in static frames and puts windows within the frames. Some WMs, like i3, resize and shuffle all your tiles automatically when you open a new window, which I hate. On stumpwm, the screen starts as a single big frame. I can divide that in half vertically or horizontally, then further subdivide those frames and so on.
- It uses thin, unobtrusive window decorations and has a small discreet "mode bar" which I configured to show the time and a list of windows.
- Its key combinations are less conflicting than other tiling WMs. By default, all stumpwm key combinations begin with Ctrl-t, so to e.g. open a terminal I'd type 'Ctrl-t c'. This really only conflicts with opening a new tab in a browser, but hitting 'Ctrl-t t' sends a Ctrl-t through to the underlying application and I get used to it very quickly.
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:- It's hierarchical. Notes are arranged in a tree descending from a single root--but a note can appear at multiple places in that hierarchy.
- It's file-based. Your notes go into a directory. Each note lives in its own subdirectory. The body of the note is one file, the metadata for the note (a list of children, etc.) is another file, and there's a directory for "attachments" (PDFs, images, etc. that I want to associate with the note).
- It's terse. I knew the only way I'd ever use it was to make it as painless as possible, so there are no long GNU-style options. Most of the common commands have a single-letter shortcut, e.g. to create a new note I can just say `zk n` instead of `zk new`.
- It's in open formats. Note metadata is just a JSON structure in a file. The body is always a plain-text file. If I handed my zk directory to a random person, they could navigate through it purely by clicking around in a file explorer. Any programmer could write tools to parse it in an afternoon.
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.