Introduction
This post is about a tool I always feel very crippled without, namely the incredibly useful AutoHotkey. I always install this onto new machines and I rely on it heavily every day. The strange thing is that rather few people I meet know about it so I thought I’d remedy that ignorance somewhat by posting an overview here on my blog.
So what is it? AutoHotkey allows you to map keypresses to custom macros.
This key press mapping works in any application by default and the macros that are possible are very flexible.
Some examples
The most common use is probably to start applications for a given key combination. Here’s one I use:
!#n::Run Notepad++
This starts Notepad++ when I press Ctrl-Alt-N
You can also write a little more complex macro code (the macro language is a custom one for AutoHotkey, here’s some documentation)
^!Enter:: FormatTime, CurrentDateTime,, yyyy-MM-dd EnvGet, UserName, UserName SendInput /%CurrentDateTime% %UserName% return
This inserts a timestamp with my username when I press Ctrl-Alt-Enter
.
Example: /2013-11-02 emila
Note that this works in any application since AutoHotkey sends standard Windows messages simulating keypresses for the text. So there’s no problem to use this macro in Notepad, for example.
To take this one step further, the key code trigger does not have to be based on qualifier keys such as Ctrl, Alt etc, it can also be a sequence of standard characters. Here’s one example of this:
; Today ::tdy:: FormatTime, CurrentDateTime,, yyyy-MM-dd SendInput %CurrentDateTime% return
This creates a macro that inserts the current date every time I type the sequence “tdy” followed by a word delimiter (space, tab, dot, comma, etc). This simple macro is probably the one I use the most, it’s so incredibly useful to have easy access to the current date when taking notes, creating folders, etc.
I also have a few code snippets I use a lot when programming:
::isne::String.IsNullOrEmpty ::isnw::String.IsNullOrWhiteSpace ::sfm::String.Format
This way I never feel tempted to write string comparisons such as if (s == null) { ... }
, it’s just as easy to write if (String.IsNullOrEmpty(s) { ... }
using my snippet. And this kind of snippet works even in Notepad 🙂
This ability to replace character sequences is also very useful for correcting my common spelling errors:
::coh::och ::elelr::eller ::perosn::person ::teh::the
I try to detect common operations that I often perform that can be automated and try to write an AutoHotkey macro for them. An example of this is that I have noted I often have to write a valid Swedish social security number (personnummer) when testing applications I write. This can be a pain since the number has to end with a correct checksum digit, so I wrote a simple web service that creates a random SSN and returns it. This service can be called from AutoHotkey like this:
; Anropa web service för att skapa personnummer ::pnr:: EnvGet tmpDir,TEMP UrlDownloadToFile http://kreverautils.azurewebsites.net/api/testdata/personnummer,%tmpDir%\random.pnr.txt FileRead, pnrRaw, %tmpDir%\random.pnr.txt StringReplace, pnrClean, pnrRaw, ", , All SendInput %pnrClean% return
This is really convenient, I just type “pnr” and it’s replaced with a valid SSN. This really lowers the mental barrier when testing applications where this data is required, resulting in better testing. (Mental barriers when testing applications are very interesting and is perhaps worth a separate blog post some time…)
Summing it up
The above examples absolutely just scratch the surface of what you can do with AutoHotkey, so why not give it a try? It’s free, so it’s just a matter of downloading it and start experimenting. Download it from its home page.
Final tip
I like to have all my computers share the same AuoHotkey setup so I have created my main macro file (general.ahk) in a DropBox folder. I also create a shortcut in my startup folder (find it by “running” shell:startup
using Win + R) with this target string:
C:\Users\emila\Dropbox\Utils\AutoHotKey\general.ahk
Since AutoHotkey associates itself to the “.ahk” file extension, this is enough start start the script on startup. Any change I make to the macro is automatically propagated to all my computers.
Good luck with your automations!
/Emil