26 Feb 2015

Trusted Gear

Yay! GDC is next week! Will I see you there?

Ahem. Straying a bit from my usual theme here of writing about whatever little snippet or gadget I’ve come up with, for this post I will in stead share some detail on recent changes to my tool-chain of choice, which I’m quite happy about.

Every craftsman has his or her opinion on tooling, but just about everyone share the desire to tune their toolbox. Even if your opinion / taste / whatever does not align with mine, I hope that you find something useful in here.

If you really had your sights on getting some funky code snippet out of this post, here’s an unholy perl module for firing off native prompt dialogs on OS X and Windows:

And with that out of the way, let’s get something else sorted: This post will likely come off as an ad for a bunch of different software. Other than mentioning it here, I do not intend to do anything about that.

Note that I primarily work on OS X and some of the tools mentioned in this post are only available on that platform. You might still find at least inspiration in those areas though – likely very nice Windows and Linux alternatives exist. I did not look.

However if you are not on OS X, but on a tight schedule, just skip all sections other than the “Typing” section (which is probably where you’ll find the best stuff anyway).


Everyone has a system for remembering projects and TODOs. If you in stead keep it all in your head, I am glad that you’re not a very busy person – if you are busy, I would worry.

Over time I have tried many different systems for keeping track of it all – having had it as a focus of mine ever since severe physical stress symptoms reminded me that my methods were entirely inadequate.

One tool that I kept coming back to and which I have recently re-focused on is OmniFocus.

While OmniFocus is by no means perfect (I have my fair share of open suggestion posts with the developers), it does provide me with the best feature combination I have seen in this type of tool. Important to me are:

  • No restrictions or requirements on nesting/indentation depth of items.
    • The system has the notion of “tasks” existing in “projects”, but aside from this I can use folder nesting of projects and nesting of tasks as much as I like – assigning whatever meaning I want to that.
  • Everything is synchronised painlessly between fully-featured clients on my laptop, my phone, and my tablet. And it remains accessible when offline.
  • Easy, fast, unintrusive task entry.
    • The mobile clients have an always accessible “add to inbox” button and the OS X client a global task-entry shortcut.
    • The shortcut fires up a little window over whatever you are currently working, allowing you to quickly type in what you need to remember to do, hitting enter when you’re done. Optionally you can add more task details before hitting enter and continuing with whatever you were doing.
      • This is absolutely perfect when you remember a TODO unrelated to your current task or someone comes by your desk with a request.
      • My shortcut for task entry is ctrl+alt+space. I do not recall if this is the default.
    • The OS X client also comes with a “service” integration, allowing you to easily create new tasks from other applications – like one based on a file or a snippet of text or perhaps an email.
  • Optional additional classification and data collection.
    • Putting tasks in projects is your absolutely minimum flow. Even that I suppose is optional, as you could simply put all your tasks in your inbox. On top of this, you can scale it as little or as much as makes sense for your particular case. I use everything from no additionals to everything – all dependent on the nature of the task.
      • Aside from putting tasks in optional projects in optional folders, each task can also have an associated context. Different tasks in the same project can have different contexts and contexts can have additional information associated with them – like a location.
      • Assigning a due date to a task will put it in your Forecast view – allowing you to easily view what needs to get done today. This view can also show a quick overview of todays calendar and you can get notifications as the due time of a task is reached.
      • Each task can have an associated attachment. Anything from a snippet of text to a file / an email / whatever.

I use OmniFocus for all project and task tracking. However I do not try to replace my calendar with it. Scheduled events still go in my calendar (I just use iCal) and I also use my calendar to keep track of what I do with my time when on a contract.

This allows me to easily summarize for client reports when needed and I have a little Automator workflow calculate the total number of hours spent contracting this week – allowing me to easily balance the hours.


Once I am done dreaming up ideas and tasks, like so many others, the majority of my time is spent as a typist – translating those tasks into computer-friendly gibberish of one kind or another. Most of the time I find myself typing C#.

For quite a while I would bounce around between different editors for this task.

  • VisualStudio with resharper for maximum efficiency – at the cost of either rebooting into Windows or running around in the strange parallel universe of virtualisation.
  • MonoDevelop for an approximation of the tools provided by VisualStudio, feeling not quite native anywhere, but very beta.
  • Sublime Text for beautiful, responsive, unintrusive text rendering, with a wonderland of user-configurable keyboard shortcuts and extensions. And absolutely nothing in terms of VS- and MD-like project-wide assistance.

Then a while ago I added a bookmark to the “check this out” pile, for a project called OmniSharp. The promise was simple:

  1. Get full Intellisense-like completion and resharper-like code analysis.
  2. Use it in your text editor of choice.

Ha! Madness.

That was probably at least a half year ago – until I finally found some time to put aside my scepticism for a bit and try to set it up with Sublime.

You know what? It works!

This is what I currently use of the OmniSharp + Sublime Text feature set:

  • Compile check on save – with errors, warnings, and resharper-like code suggestions.
    • Some suggestions I do not agree with and luckily, as with resharper, configuration lets you easily filter those out. Unity also suppresses some warnings when compiling, so I elected to filter those out as well.
  • File auto-format when triggered by shortcut.
  • Intellisense-like auto-complete – file, project and library-wide.
  • Jump to definition / list reference points.
  • Rename.

I am probably forgetting something, but suffice to say, I no longer feel the need to switch away from Sublime Text to boost efficiency on an unfamiliar codebase.

With regards to shortcuts and configuration, there are a bunch of little tweaks you can set up for Sublime, so of-course I have done exactly that. The good part is that Sublime preferences are all JSON formatted text files, so they are easily shared in a gist:

For text editing, that produces a lovely fullscreen view like the one on the right (click for full size). Tasty, right?


After lolcat searches and menacingly typing at people who are wrong, I probably spend the majority of my browser time doing reference manual lookups. Extensions like Safari Keyword Search in combination with embedded search engines or Google site search have somewhat streamlined this task, but it never really worked solidly and of-course required that I be online while working.

Enter Dash. I can’t remember who brought it up on twitter, but that’s where I came across it and bookmarked it for later study. The idea is quite simple: It provides an offline search engine for docsets of your choosing – much like man pages.

You get to specify which docsets to download, associate a search key with each docset (IE “cpp:” and “.net:”), and specify a global shortcut for launching the search window – as you would Spotlight on OS X. But wait: There’s more!

Downloadable docsets include topic-specific downloads of wiki-fied Stackoverflow questions and answers. And since you can associate multiple docsets with the same search key, these are easily accessed when you search.

On top of all of this, Dash also comes with an iPad and iPhone client and integration for a bunch of different editors, environments and other tools – including Sublime Text.

You can find my Dash integration settings in the Sublime settings linked above. For global launch shortcut I chose ctrl+shift+space – I do not recall if this is the default.


If you, like me, grow a tad too accustomed to the default Sublime Text shortcut of alt+cmd+left/right for tab switching, I would recommend giving it a go as a global shortcut across applications. Configuring System Preferences – Keyboard as shown below did the trick for me. I primarily use it in Terminal and Safari.

And that is about all I have for now. I hope that this is useful to you and do let me know if something in here is off or if you’re more curious about something. If you are at GDC in San Francisco next week, you could even do it in person.

New Gear
Unity, iOS, TeamCity, AppCenter
RAID0 NVMe on Ubuntu
A Change of Gears
Unity Protocol Buffers
Behave 2.7
Behave 2.6
Trusted Gear
Mad Mash Versioning
Behave 2.5
Behave 2.4
The Engine Wars: Numbers
GDC 14: The Quest For Fun
Moving in Unity
Behave 2.3
Unity and .net assemblies
Behave 2.2
Behave 2.1
Behave 2.0
Unity Hacks: Dual sticks
Unity Hacks: Cameras
Unity Hacks: Touch gestures
Unite 13 video "Unity Hacks" available
The implicit local network interface
Talks and progress
Five years of Unity expertise looking for contracts
Automagic Unity Android Java gadget OF DOOM!
Invading Planet from your couch
Mountain Lion and laggy bluetooth and duct-tape
Unite 12 video and new videos section available
Asia Bootcamp videos now available
Path is now MIT licensed
Behave 1.4 released
So I've been a bit busy lately
Behave 1.3 released
IGDA Unity SIG slides
Second Unity IGDA SIG this evening: Scene construction and AI
First IGDA Unity SIG this evening
Alternative licensing available
Pathfinding in two lines
Path 2 released
Assembling and assimilating
Path 2 intro screencast
Path 2 beta release for GGJ
AIgameDev master class video now online
Expanding beta
Behave AIgameDev master class public stream
Behave master class on open AIgameDev stream tomorrow
Interview with AIGameDev
New video: From tree to code
Issue tracking on github Behave release project
IT University Copenhagen Unity course completed
IT University Copenhagen Unity course files Thursday
CPH IT University Unity course files
Behave 1.2 released
Video: Behave - starting from scratch
Behave runtime documentation updated
Behave 1.1 released
FAFF cleanup: Sketch
Building a menu of delegates and enums
Pick me! Pick me!
Optimising coroutine yielding in C#
Downloading the hydra
New license of Path: GPL
GUI drag-drop
Logging an entire GameObject
I bet you can't type an A!
Where did that component go?
New and improved: Behave 1.0 released
Behave 0.3b and unity 2.5
Behave 0.3b hotfix
Path tutorial video available
Path 1.0 launched!
Continued community tutorials
Community tutorial
New tutorial
First tutorial available
Behave 0.3b
unite '08 open-mic session
Behave 0.2b
Behave 0.1b
Behave pre-release
Path beta 0.3b
Path beta 0.2b
Path beta 0.1b
Path pre-release