HACK / MAKE

Scripts and Hacks Grab Bag

The origin of the term “Life hacks” was all about engineers who would build tools to help them in their daily life. As I’ve gotten more familiar with languages like Applescript, PHP, and Python, I’ve been creating more of these hacks to help out with things I do on my Mac.

Here’s a grab bag of some of those I’ve created recently. They are all in different states of stability but I use most of them so they’re at least not completely broken.

OmniFocus

Set Start Day for Selected Tasks: OmniFocus has great support for entering dates with quick shortcuts like Mon and 2w. But they don’t have a quick way to get to the start date field from the keyboard.

I’ll often have a series of tasks that have to push back for some reason. The way I work is often based on days, like “I can’t do this now but I should have a chance on Thursday.” This applescript prompts for you to pick from a list of days. You can type in th and hit enter and the selected tasks will be scheduled for a Thursday start date.

This does all the date math on its own, where it will always choose the following occurrence of that day. I’m writing this on Saturday and if I choose Saturday from the list it will set the start day for next Saturday.

It’s a fast and logical way to schedule tasks so you don’t have to think about them until the time comes.

Download Set Start Day Applescript

Using an Applescript .app to trigger tasks from a recurring OmniFocus action: I have repeating tasks in OmniFocus to create things like weekly log files or emails for status reports that I want to automate as much as possible. Automating it is not only faster but maintains consistant naming schemes if you’re particular about that like I am.

It’s simple to create something in applescript to make a file:

set today to do shell script "date +%Y-%m-%d"
set filepath to "/Users/nickwynja/Desktop/"
set filename to "Test " & today & ".txt"

do shell script "touch " & (quoted form of (filepath & filename))
do shell script "open -a BBEdit " & (quoted form of (filepath & filename))

That will create and open a file named Test 2012-11-10.txt on my desktop in the app I specified in the open -a command. Most of that is actually shell because it’s easier to do one-liners and often more compatible between different apps.

If you save this as an application in Applescript Editor, you’ll be able to attach the .app to a OmniFocus task, and with one click, it will create and open the file you need.

Keyboard Controls

Media Control Keys with Rdio and iTunes: Most of the time I use iTunes set today to do shell script “date +%Y-%m-%d” which is well bound to to the Since getting a [clicky keyboard](http://wwstandard Previous, Play/Pause, set filepath to “/Users/nickwynja/Desktop/” If yoript Editor, you’ll be able to attach the .app to a set filename to “Test ” & today & set filename to “Test ” & today & “.txt”That will create and open a file named Test 2012-11-10.txt on my desktop in the app I specified in the open -a command. Most of that is actually shell because it’s easier to do one-liners and often more do shell script “touch "” & filepath & filename & “"”compatible between different apps.”.txt”OmniFocus task, and with one click, it will create and open the file you need.Next controls on a Mac. Keyboard Maestro’s built in macros for these controls behave the same way as a do shell script “open -a BBEdit "” & filepath & filename & “"”standard Apple keyboard. Sometimes when I’m feeling frisky, I’ll open Rdio to listen to some new tunes. This means I have both Rdio and iTunes open and all of a sudden these media controls become a mess. I needed something that would Play/Pause the right app when it was playing.

Since I only sometimes have Rdio open, this script would check for that first. If Rdio is running, the script sends the specified control to Rdio, or else it sends it to iTunes. This logic only fails when I have Rdio open but not playing and iTunes (which is always open) playing a song. So I just get in the habit of quitting Rdio when I’m not listening to it. This will probably work with other apps too as long as it has a similar Applescript dictionary.

This is such a great solution and has gotten my using Rdio way more. Before I’d have both open and instinctively hit the Play/Pause key and then iTunes would start. It would be a train wreck of two songs playing over each other. Connect these scripts to Keyboard Maestro and enjoy seamless control over your audio apps.

Download Rdio/iTunes Media Control Applescripts

Open and Clear Notification Center: Notification Center is a really nice way to get an overview of what you need to know so you can process it or get back to work. Apple gives a way to open Notification Center using the keyboard by setting a shortcut in System Preferences > Keyboard > Keyboard Shortcuts > Mission Control. The most often action I have in Notification Center is to open it, check the preview of new emails that have come in, and then clear out the notifications so I can ignore and come back to them later. There’s no keyboard binding for this but you can set something up in Keyboard Maestro to imitate clicking on the little x. The “Move or Click Mouse” macro is perfect and gives you options to click at a certain location on the screen and then restore the mouse location to where it was. This is what my macro command looks like.

I have F12 set up to open up Notification Center, glance at what’s in there, then hit control+F12. This imitates a click for the topmost x button. If there’s notifications from different apps, you’ll have to clear a few times. When I’ve sufficiently ignored everything, I hit F12 again to close it.

That’s efficient first-level processing without ever leaving my keyboard.

BBEdit

BBEdit is so wonderfully scriptable and that makes me happy inside.

Autosave Scratchpad Files: I love my scratchpads. I dump random strings of text in there, list to-dos, and leave notes to myself. I’ve always wanted to be able to pipe text into it from scripts and Alfred extensions but the problem was the file wouldn’t autosave like it would if I was using nvALT. If I would try to append text to the scratchpad and it wasn’t saved I would have conflicts.

I found this gist that ties into a hook when you switch focus away from BBEdit and saves open documents. I didn’t want it to save all open documents though, just my scratchpad.

All I needed to do was change this line which gets all open documents:

set docList to every text document in theApp

To this which matches the document name of my open scratchpad:

set docList to every text document in theApp where name of it contains "Scratchpad_"

Follow the documentation in the script to set it up. If you bought BBEdit in the Mac App Store, you’ll also have to install a script to get around sandboxing and authenticate this save for you. You can find instructions to do that here.

Now I can assume that in most use cases my scratchpad is saved and I can append text without conflicts. I use F2 as a keyboard shortcut triggering the script that opens my scratchpad and now have ⌘-F2 to append my clipboard to the end of the saved scratchpad using a hacky keyboard maestro macro.

Text Filters: I’ve discovered that you can run scripts on text selections and if you only intend to do that action inside of BBEdit, it runs faster than using Services.

I previously created a service that would mark may plain-text todos as completed. This worked but wasn’t as fast as Text Filters are. The service was written in python so all I had to do was take it and add it into /Text Filters in BBEdit’s Application Support directory. All it is is a simple find-and-replace for the [ ] Task string I use for a to-do and replace it with [X] Task. But this helped me figure out that I could manipulate other strings with more powerful scripts.

I haven’t gotten too deep in this yet but one that I did write helps me format markdown headers. Often I’ll just write and then go back and format. BBEdit’s clippings can work well for markdown formatting but you can’t put much logic in them.

What I wanted to do was select a string and wrap it with a # to make a heading like this:

# Heading 1 #

The problem with clippings is that since I wanted the spaces, wrapping a selection with a clipping and then repeating would add extra spaces in between the # like this:

# # Heading 2 # #

That’s neither attractive or valid markdown. This python script (which probably could be simplified) does the job perfectly and works for multiple lines too.

import sys
import re

for a in sys.stdin:
  b = re.sub(r'^(.*?)$', r'# \1 #', a)
  c = b.strip("\n")
  d = c.replace('# #', '##')
  print d 

With this, I can select a heading or several lines of headings and it will wrap them in #s. Tap the keystroke again and it will add another one before and after without the space. It’s the little things that make me happy.

Download Markdown Heading Text Filter

Copy Slug to Clipboard: The way Second Crack (the blogging engine I use) works is it takes the file name of the post as the URL slug. I usually have the title of the post decided and written at the top before actually saving the file. This service which Brett Terpstra original shared with me will take the selected text—in this case my title—and turn it into a slug-ready string on your clipboard.

I’ll copy my title “Scripts and Hacks Grab Bag” and run the service on it. Hit Save and the save prompt will open then paste and in goes the slug scripts-and-hacks-grab-bag. Boom. Off it syncs with Dropbox and is ready to publish.

Download Copy Slug to Clipboard Service


That’s it for now but I’ll probably do another one of these grab bags when I’ve built up a bunch more interesting hacks to share. I hope that these are useful or at least inspire you to find ways to improve the efficiency of your work.

Update: Cleaned up the Applescript to make and open a file. Thanks to reader Jan-Yves for the quoted form of tip.

Thoughts or comments? Let's talk on Twitter or send me an email.