It's been pointed out to me that very few programmers are willing to share advice about their setups, so I thought it might be a good idea to run through my regular environment top-to-bottom.


I'm currently using a Lenovo N20p.

Lenovo N20P

It's a Chromebook, and it set me back just less than £200 when I bought it. It's got enough processing power for web browsing and every programming-related task I throw at it, and I've never really felt the need for anything beefier (which is lucky, given I probably couldn't afford it either!).

Operating System

Chrome OS, the default, has a well-polished interface great for web browsing, but it doesn't have nearly enough functionality for my needs as a programmer.

Chrome OS

Chrome OS

Because of this, I've used Crouton in order to run Ubuntu 14.04 in a chroot. Performance is good, and swapping from one OS to the other is eye-blink fast (which continues to amaze me) and accomplished with a single keyboard shortcut.

Ubuntu 14

I had to specify the Audio, Keyboard and Xiwi targets for all the functionality I needed, but beyond that it was incredibly simple to set up.

There's some features that I don't use much but occasionally come in handy, such as "xiwi": running an Ubuntu native program in a window inside Chrome OS. I typically just switch over, or open a Crosh tab, but occasionally I'll open an Emacs instance inside Chrome OS.

window emacs

I've got some aliases and functions set up in my .zshrc which mean I can just type window <command...> to run "command" in a new ChromeOS window.

Windowing System

I use Awesome Window Manager for a tiling window layout. It's using a very-slightly-modified version of the Multicolor theme here, and has 5 'tags' (i.e. virtual desktops, for my purposes at least): Web, Docs, Code, Term and Other.

awesome tags

My config file is a bit more customized, mainly with different keyboard shortcuts and layouts. In particular I've included lain's 'centerwork', which I use a lot of the time for having my code in the center and a couple of small terminals to the side.



I use gnome-terminal with the Base16 Tomorrow Dark theme and the Monospace font (shown below in colored 'less' output). I'm quite indecisive about fonts; I also quite like Source Code Pro and Inconsolata.

monospace in terminal

I've also got rxvt-unicode set up to look the same way, since yeahconsole doesn't seem to support gnome-terminal very well. I don't use rxvt-unicode (or "urxvt") as my main terminal because embarassingly enough I haven't worked out how to copy and paste in it yet.



I've converted to ZSH and have used oh-my-zsh for quite some time. Recently I've moved over to using antigen for zsh configuration, but I'm considering getting rid of it as a ZSH session now takes 1.12 seconds to start and that's just too long.

I'm using the default 'robbyrussell' theme, with a few antigen plugins (python, pip, virtualenv, git, command-not-found and zsh-syntax-highlighting) installed.

Text Editor

I use Emacs 24 for the vast majority of the code I write.

Emacs python

Emacs python docs

My config file is here, but here's a quick summary:

  • Removed cluttered UI (menu bar, scrollbar etc.)
  • Bind C-i to finding index items
  • Add the Marmalade package repository
  • Use Sublimity mode to center text in a single fullscreen frame
  • Highlight the current line
  • Use the Base 16 Tomorrow Dark theme
  • Add a shortcut to 'rotate' windows (i.e. turn a horizontal split into a vertical one)
  • Enable autocompletion and inline documentation for Python with Jedi

I'm not a huge fan of the docs' yellow colour, so I'll likely see if I can change it at some point in the near future. It's fine for now, though.

Editor Alternatives

I've never learned to use Vim aside from the very basics, so it's completely stock for when I absolutely have to use it - which is never. Luckily it runs in the terminal, so I don't have to mess around with color schemes.

I've had a play around with Atom and, while I think it's incredibly slick, there's a couple of problems:

  • I'm too used to Emacs' keybindings; and
  • The startup time is prohibitively slow.

The first problem is solved (partly) by emacs-plus, although some bindings are missing and it doesn't get rid of the old bindings. But the second isn't anything I can currently deal with.

I'll run through my remote server's setup in another post.