Friday, August 19, 2011

Scripting out Monotony with AHK

I posted previously about reducing the use of your mouse to speed up your daily computer work (not just development). I wanted to elaborate a bit more on Auto Hot Key (AHK) that has been around since 2003 but I don't run into a lot of people that use it.

Wikipedia
AutoHotkey is a free, open source macro-creation and automation software utility which allows users to automate repetitive tasks. Any application user interface can be modified by AutoHotkey (for example, with Emacs style).[2] It is driven by a custom scripting language that is aimed specifically at providing keyboard shortcuts or hotkeys.

Before Windows 7 came out I had an AHK script that would allow me to arrange a window to take up 1/2 the left or right side of my monitor with a quick keyboard command. Of course the 'Snap Feature' is now part of Windows 7 but AHK allowed me to easily build one of the main features Microsoft promoted during their Windows 7 campaign - I do have to point out in the commercial the guy is using the mouse to drag the 2 windows to the side instead of [Win Key]+[Left Arrow] then [Alt]+[Tab] then [Win Key]+[Right Arrow] which would be faster :)

Microsoft took care of the snap feature for verticle tile placement but sometimes I like to have a window snapped to the left but take up more than 50% of the screen area. This allows me to have more area for my document but still have the ability to see part of my desktop on the right in case I were using Sidebar Gadgets or in this case my Sticky Notes. If you look at the screenshot below, you can see that my Posterous editing window at 50% leaves very little room for my Rich Text Editor.

Screen1

So let's create a script that will Snap my window to the Left and then make it a bit wider.

The first thing we will download and install AutoHotKey from here.

We then want an .ahk script in our Startup folder so our commands are available when Windows starts. It can be blank for now.

Next we want to download a AHK macro recorder here (written with AHK scripting) that will record keystrokes and mouse movements and generate AHK scripting for us so we don't have to code as much from hand. As you get familiar with AHK you will need the Recorder less and less but it will be your friend when you are fist starting out.

I am a big fan of Continuous Improvement both in development and life. As time goes on we are going to want to add or maintain some of our short cuts. I am at the point now (after using it for 7 years) that my brain automatically says "Hey James, you have already done this combination of steps 3 times this week" and I open up my .ahk file and assign the steps to a shortcut key. There is no sense in making it difficult to edit, build or record our AHK scripts so the first thing you will see in my script are 3 shortcuts to do just that.

Screen2
Reviewing AHK documentation or using the Macro recorder you will notice that "<" is Left and "!" is the [Alt] key. So above you can see that when I do a [Left Alt]+Z, notepad will open up my AHK script. [Left Alt]+X will execute my .ahk script to take into account any changes I just made. [Left Alt]+C will open up the Macro Recorder. There are also text editor's that have color coding and intellisense for AHK scripts that you could use instead of Notepad but I haven't installed them since the last time I rebuilt my laptop.

So now that we have those 3 key hot keys assigned let us do a [Left Alt]+C so our Macro Recorder will open.

Screen3
To create our 'Wider Left Window Snap' functionality we will do something like the following narrative:

  1. Hit Start on the Recorder (this will minimize the recorder so it is not with focus)
  2. [Windows] + [Left] combo which snaps my current window to the Left.
  3. Click the right border of the window and drag it so the window is at the size you like.
  4. [Ctrl] + [Shift] + [End] to stop the recorder

Here is what our recorded script looks like.

Screen4

One thing to notice is that we aren't quite done because our recorder doesn't do a good job at recognizing drag and drop, so we are going to have to script that part by hand. What we can quickly do is record once more and click on the area of the screen that is where our right window border. This will give us the coordinates we need for our drag and drop action. I also updated the script to use the #{Left} instead of the LWin and LWin Up functionality because it is cleaner. So our finished script looks like below.

Screen5
For simpler scripts you can have everything all on 1 line, but here we have a 6 line block not including the comments. Here is the breakdown:

  • #.:: - # is the Windows key so if the user clicks {Windows}+{Period} then this script block will fire. I used the period key because it has a ">" key above it and I am adjusting the window to the right and the greater than sign is like a Right arrow. You could assign this script block to whatever hotkey combination you like.
  • Send, #{Left} - The script will send the {Windows}+{Left Arrow} to the system which will Snap the window to the Left
  • Click, 686, 305, Left, down - This is the first part of our drag and drop. We are telling the script to go to x686,y305 and hold down the Left mouse button
  • Click, 1078, 305, Left, 0 - Here we are dragging our mouse to the x1078,y305 position
  • Click up - release the Left mouse button
  • return - finish the script block 

We can then {Ctrl}+S to save our .ahk script, then {Ctrl}+X to rebuild the script. Now when in any window and a {Win}+{Period} is struck the current window will quickly resize to a position like below.

Screen6
What else?

Start simple and then expand on your script. I would suggest putting in words or phrases that you type a lot throughout your week. Sure there are plug-ins for your browsers that can fill in your address information but they don't work across other applications so I have quick hot keys for a lot of my contact information. Below you can see some of them.

Screen9

So now I can quickly type in phone numbers, passwords, usernames whatever else with 2 key strokes (Right Alt and then a letter or number). Yes storing passwords and credit card information in plain text isn't the best idea but I figure if someone has access to my hard drive to read this file then I have a bigger concern.

There are also Hot Strings too which are cool. Instead of using a key combination to run a script, AHK will monitor your key combinations and when it finds a match it will replace the combination with what is specified. I use this for email addresses and words I often mistype.

Screen7
So any time I type "j@" it will be replaced with my work email and if I do "c@" it will be my gmail address. If I accidently type "teh" it will correct to "the". I also have the scripts below that will navigate up/down 5 lines at a time and left/right words at a time. This makes me quickly navigate with the keyboard.

Screen8

You know enough now to get creative. For example I have a script where with a quick key combination; I launch Google Chrome, go to sirius.com, open up their Listen Player and ensure the station is on Alt Nation. Now I just need a script that will post a new and insightful Blog Post with a quick key stroke.

No comments:

Post a Comment