TextExpander Pricing Adjustments

Last week TextExpander announced its conversion to a subscription model and storage of snippets at TextExpander.com. I was actually okay with the new pricing. That isn't because they paid me to produce their videos (they did) or that they sponsor the Mac Power Users (they do) or even that the developers are dear friends (they are). To me it was worth it because the application saves me so damn much time. When it comes to automation, however, I'll be the first to admit I'm pretty far out there. A lot of users complained the pricing was too high and now Smile has lowered it.

You can read all the details at Smile's blog but the short version is: $20/year for existing users and they'll be keeping a separate build that does not sync through TextExpander.com for those who prefer to put their snippets in iCloud or Dropbox. 

New TextExpander and Video Series

Smile Software has released a new version of TextExpander. This upgrade has been a long time in the making and is the culmination of a lot of work. TextExpander got a new design and now you’ll store your snippets at TextExpander.com. There are a lot of advantages to keeping your snippets at TextExpander.com. To start out, you can now share snippets and snippet groups. The application can do this on an individual basis and also among work teams. This lets management create snippets that are used, for instance, in a customer service department across the company.

This new model also lets TextExpander share your snippets among multiple platforms. You can share your snippets on the Mac, iPad, iPhone, and now on Windows. The Windows app is currently in beta but I’ve been testing it and it's pretty great seeing TextExpander work on Windows. This will be especially nice for those of you stuck using a PC at the office.

I’ve made a series of videos about the new version that you can find here. There are a total of 10 videos and watching these make you a TextExpander pro. They are, essentially, a free MacSparky Field Guide on TextExpander so make sure to check them out.

With all of these changes, Smile has switched TextExpander to a subscription model. I know that makes some users nervous but, frankly, I think it is a good idea. As a fan of productivity software, I’d really like the companies that make my favorite tools stay in business. In order for TextExpander to continue to get the love and attention it needs to make my life so much easier, it needs ongoing support. TextExpander is so worth it.

Automating Invoice Processing on My Mac

When I first opened my solo law practice, one of the unanswered questions in my mind was how I would go about billing clients. This is supposed to be hard. Some law firms spends days every month on getting bills out the door. Others pay outside vendors. I decided to nerd the s%*t out of this problem and do it myself.

I use an online practice management solution, Clio, to track my time. At the end of the month, the service creates PDFs of my invoices that go into my Mac's Downloads folder. Rather than show an actual client invoice, I'll use this dummy invoice for my side landscaping business.

One of the tricks of this workflow is that when I push a button in Clio, the PDF is created and opens automatically on my Mac in the Preview application. The first tool to help me automate the process is Hazel. I've talked a lot about Hazel at this site and on the podcast over the years. One of Hazel's many talents, is the ability to identify, name, and move files. So I've got Hazel constantly looking at my Downloads folder. If it sees a PDF file that has the text "Lawn Care Products and Livestock", "PO number", and "Gunther's Gardening", it will start acting on that file. My logic is that there will be no PDFs in my Downloads folder that have all of those words in that order that are not an invoice. Here's the Hazel Rule.

Once Hazel finds a match, usually within seconds of the file downloading, Hazel renames the file with the current date, client name, and a further description of the invoice. Because the PDFs open on my desktop at the time of the download, it's fun to watch the name change as I'm reading the invoice over. Next Hazel moves the invoice to a folder I've designated in the client's Admin/Invoices folder.

So within seconds of downloading the invoice, my Mac has named and moved the invoice to its appropriate folder.

Next I click on the sharing button in the Preview App (which is diplaying the invoice). From there I click on the Mail icon and this creates a new blank email with the invoice already attached.

My next big tool is TextExpander. I manually type in the client's name as an email recipient. Then I tab down to the s ubject line and fire off a TextExander snippet. The snippet phrase is "newbill". The snippet first fills in the subject line with the terms "Sparks Law %B Invoice" which TextExpander fills in as "Sparks Law October Invoice". Next month the snippet will automatically change "October" to "November". (TextExpander recognizes the wildcard %B as the current month.)

Next, the snippet asks me to fill in the client name and let's me choose from several frequent options. Three common issues in these cover emails are questions about whether the client wants to pay online via credit card, wants a snail mail copy of the invoice, and if there is someone else at the company that needs to get the invoice. I use TextExpander Optional Selection phrases for this. I can check or uncheck the appropriate phrases for the particular invoice.

Finally,  I have a multi-line field at the bottom where I can write or dictate in a further description of services or plans for the coming month.

Here is the finalized email from the above snippet screen.

Here is a screenshot of the snippet form TextExpander.

Here is the full text of the snippet if you want to adapt it for use use it in your copy of TextExpander at home.

Sparks Law %B Invoice
%key:tab%Hi %filltext:name=field 1%,

Attached is this month’s invoice. %fillpart:name=online pay:default=yes%I also sent you a separate email with online payment instructions if you’d prefer to pay that way via credit card.%fillpartend% %fillpart:name=optional part 3:default=yes%Also, please let me know if you’d like hard copies of these invoices in the mail.%fillpartend% %fillpart:name=someone else:default=yes%Finally, if you’d like me to direct these to someone else at the company, let me know.%fillpartend%

%fillarea:name=Message:default=Thank you for your business.%

Kind regards,

David Sparks
Sparks Law

So this detailed explanation probably sounds like a lot but in action, the whole process is wicked fast. It takes just moments for me to approve and download a PDF invoice, at which point my Mac names and files the invoice, and I send it off to the client with a customized email. I love being a nerd.

As an aside, I have had very few clients take me up on the offer to get snail mail invoices. Almost everyone wants things in just PDF form. I have brilliant clients.

TextExpander Script for Recipient's Name in Outlook

Awhile back, I wrote this post about how to automatically add a recipient's name to an email. Reader Jaco Muller (Twitter) liked the idea but uses Outlook. Jaco re-wrote the script to work with Outlook. Okay Outlook users, here you go. Thanks Jaco.

tell application "System Events"
    tell process "Microsoft Outlook"
        set theToRecipient to (value of static text of text area 1 of scroll area 1 of splitter group 1 of window 1)
        set theToRecipient to theToRecipient as string
        if (count words of theToRecipient) is greater than 0 then return word 1 of theToRecipient
    end tell
end tell

Automatically Add Recipient's Name to Email with TextExpander

I occasionally have need of a TextExpander snippet to automatically add the first name of an email recipient to the body of an email. Over the years, I've made lots of snippets that have a fill-in field asking me to type in the recipient's name but wouldn't it be great if the tiny robot inside my Mac did it for me? To a certain extent, this quest has been my white whale and I've been plunking away at it when the mood struck me for the past year. I initially went down the road of AppleScript, which never worked consistently. Ultimately, I found success using System Events. Below is the AppleScript code for System Events that pulls the first name from your recipient and types it in the subject line or body of the message.

tell application "System Events"
    tell process "Mail"
        tell text field "To:" of window 1
            if UI element 1 exists then
                set theToRecipient to (value of UI element 1)
                if (count words of theToRecipient) is greater than 0 then return word 1 of theToRecipient
            end if
        end tell
    end tell
end tell

I owe many thanks to Ben Waldie (@AppleScriptGuru) for his assistance in getting this to work. I also had a lot of help on this from Greg Scown at Smile (@macgreg). I put this script into a TextExpander snippet designated AppleScript. It looks like this.

Typing "xnm" in an email will insert the recipient's first name. You can combine them with additional snippets in TextExpander. For example, this snippet ...

... is activated in the subject line. It types "Purchase Confirmation", then hits the Tab Key, jumping to the message body, and then addresses the email to the customer first name and some additional text. Note the phrase "%snippet:xnm%" runs the prior snippet to drop the name in the text. This allows you to run an AppleScript inside a text snippet, which I thought was particularly clever.

Click HERE to download these snippets.

Automating Subject Line and Message Body with TextExpander

The below screencast is one of nine that I did for the new version of TextExpander for the Mac. At the end, I added a bit about automating email subject lines and message bodies with one snippet and I seem to have touched a nerve. I've received a ton of email about this. A lot of people didn't realize this is possible. 

The trick is the Tab key. In most mail applications, the tab key moves you from the subject line to the message body. Setting the curser in the subject line, you can have a TextExpander snippet type the subject line, the tab key, then the message body. For instance:

Subject: How about some waffles?
Dear Jason,
I'm really hungry for some waffles. How about you?

Your pal,

If you are automating email that includes a standard subject line this can be a huge time saver. Don't forget you can also include variables and fill-in snippets in the subject line as well. For instance, if you are standardizing the email for your monthly invoice, the subject line snippet could be:

ACME %b Invoice

which would render as:

ACME June Invoice

Anyway, if this stuff interests you, it wouldn't hurt to watch the below screencast. If you'd like to see more in this screencast series, click on the "Playlist" button. I'm proud of all of them.

TextExpander for Mac Version 5

Today Smile Released TextExpander for Mac, Version 5. The new version has some great new features including the ability to recognize frequently typed phrases and offer to create new snippets for you, remind you when you type a phrase for which you already have a snippet, improvements to fill-in snippets, iCloud sync, and Java Script support. I did a whole series of videos on the new version and they came out great. There are 10 videos in total and they really give you the soup-to-nuts training in TextExpander. If you are already a pro, just watch the "What's New" video below.

TextExpander Signature Line Snippet

This is probably a lawyer thing but I often find myself adding signature lines to the bottoms of documents, particularly contracts. Something like this.

Dated: November __, 2014           ________________
                                                      David Sparks

I was doing this the other day for about the millionth time in my 21-year career as an attorney when it occurred to me I could automate this with TextExpander. Here is my new snippet

The first bit:

Dated: %B __, %Y            ____________________________

This creates a line with the date using the format of Current Month __, Current Year (e.g. November __, 2014). Then it tabs and and draws a line for the signature.

The second bit:


This repeatedly bangs the tab key and then dumps the contents of the clipboard.

The way I use this is to select the person's name from somewhere else in the document, copy it, and then fire off the snippet at the bottom. I use xsigline to trigger this snippet.

This is probably a lawyer-only thing but I do know a few lawyers read this site. Either way, you can download the snippet here.

Pasting Plain Text with TextExpander

There are a lot of ways to paste text. The most common way I do it is with the Command-C and Command-V shortcuts. However, a lot of times you are working with text that is carrying a lot of formatting baggage and when you use the standard paste, the text shows up in your document unusable. Most apps that deal in text give you an option to paste and match formatting and the keyboard shortcut for that is usually Shift-Option-Command-V or some near-variation of that. The trouble is that the shortcut isn't universal and, even worse, some apps that involve text fields don't have any support for an option to paste as plain text.

TextExpander to the rescue. This is perhaps the easiest snippet I've ever posted. I just invoke the clipboard formatted as plaint text. My snippet is xpt (X-Plain-Text). This works everywhere on the Mac. (Even Microsoft Word.) I find typing x-p-t much faster than wrapping my fingers around more complicated combinations or mousing into menus.

I've also got one for pasting rich text from the clipboard, x-r-t, that I use much less frequently. 

I know this is a bit obvious but I showed this to a friend recently and she thought it was pretty swell. You can download my clipboard snippets below. Also, I've got a lot more snippets for download over here.

Clipboard TE Snippets

TextExpander for Quick Defer+Due Dates in OmniFocus

Max Masnick is using Text Expander to quickly enter defer and due dates in OmniFocus. Max primarily uses this for events that have the same defer and due dates. For example if you want a task to disappear but show up as due on Monday at 9am. I don't have much cause for that style task because I so rarely use due dates but there is no reason you couldn't also use this to defer with later relative due dates, for example two weeks from Friday, which in OmniFocus speak would be 2w Fri. Moreover, Max figured out how to combine defer dates and TextExpander so of course he gets a link.


TextExpander touch 2.5 screencast

I had the pleasure of producing a video for Smile Software about the new features in TextExpander touch version 2.5. I’d like the think the video does a good job of getting you up to speed with TextExpander touch regardless of your experience with the app and demonstrates some of the new 2.5 features. The snippet group management is much improved. You can now watch, download, and otherwise consume it at Vimeo.

TextExpander Touch 2.5

Yesterday Smile released TextExpander Touch version 2.5 for iOS. This free update includes a new iOS 7-style user interface and several tools to assist snippet management from within iOS. They spent a lot of time working on the little things and it shows. Some of my favorite new features are:

  • Reordering Groups
  • Sharing a completed snippet with the sharing menu
  • The ability to disable specific snippets for iOS
  • Gestures: three finger tap to share and two finger left swipe to copy

  • iOS Keyboard Shortcuts: 

    • ⌘+ and ⌘- increase and decrease the font size of selected text

    • ⌘N creates a new snippet, group, or note

    • ⌘Return functions as Done, or shares snippet or note

    • Escape functions as Cancel

    • ⌘T toggles between Notes and Groups

    • up and down arrows navigate through the list of snippets or notes on iPad

I use TextExpander often on both the Mac and iOS. The new URL callback method for sharing snippet groups to apps has been working fine and I'm happy to see Smile giving TextExpander even more love. Did you know I've got a bunch of snippet groups right here for download?

Throwaway TextExpander Snippet Tips

Dr. Drang posted this week about the value of throwaway macros and snippets. He’s a fan. So am I. I’ve referred to this before on the Mac Power Users but never posted on it here. Whenever I find myself doing anything remotely repetitive, my nerd-senses kick in and I look for automation. With text, that’s usually done in TextExpander. For example, a few weeks ago I had to ask a series of repeated questions that involved a rotating set of variables.

  1. Where’d you get the ACME dynamite on Contract #X?
  2. Did you leave the dynamite in Y’s expected path?
  3. Was it the same dynamite from Contract X?
  4. Did Y run over it?
  5. Did Y blow up?

My questions were actually a little different but I needed to ask them many times with various combinations of Xs and Ys.

In this case, the contract numbers were a 25 character string of gibberish and I already had a text file with all of the contract numbers in it. So I made the snippet with TextExpander’s clipboard function for the X. (Did you know TextExpander will insert the clipboard contents in a snippet? The syntax is %clipboard.) Before starting the snippet, I’d go to the text file and copy the contract number into my clipboard for my X.

For they Y variable I used a fill-in snippet. Don’t forget that you can have the same fill-in snippet repeat multiple times in a single TextExpander snippet. To do so, simply copy and paste the snippet syntax (e.g. %filltext:name=Sample Fill In%) in the snippet wherever you want it to appear. Then, when you trigger the fill-in snippet typing it once in the first instance fills it in at all of its other instances. Building the snippet took some time but once it was right, populating the questions (there ended up being hundreds of iterations) was fast and there were no mistakes. Overall, it took a fraction of the amount of time I’d have spent doing it manually and was much more accurate. Afterwards, the snippet was completely useless and went into the TextExpander dust heap but for a little while, it was my moon and my stars.

Speaking of TextExpander, did you know I have a whole page of downloadable snippets?

TextExpander Snippets: Media Review

Screen Shot 2013-09-25 at 10.32.56 AM.png

I've started writing up little mini-reviews for myself when I finish watching a movie or reading a book (or comic). I am currently saving these to a text file in nvALT but I also like the idea of saving them to Day One. I originally got the idea from Tulio Jarocki but when I finally got around to it, his site appears down under re-construction. 

Anyway, the snippets all call up some fill-in fields and option fields letting me describe, rate, and review each media. Since I read quite a bit, I find these little notes helpful when recommending books to friends and to confirm whether or not I've read a book already, which, sadly, sometimes takes me 100 pages to realize. 

On the subject of TextExpander, they just released version 4.1 with 100% more EMOJI.

Click Here to Download Media Review Snippets

Taking Better Meeting Notes with TextExpander


At Macworld I sat on a panel with Jeff Taekman, my spirit brother from the medical profession. Jeff sits in on a lot of meetings and talked about how he uses TextExpander snippets and Drafts to speed up note taking. He even wrote it up for Macworld. I took notice and came up with my own meeting snippet, which you can download here.

Meeting Information

 Jeff uses a text description to make the note a header in Notesy (for searching elsewhere), like meetx-david and katie re show. I don’t store meeting notes that way. I keep a bigger note per project that contains a list of meeting notes throughout the project. Text is cheap and it is easier for me to access it all in one place so the meeting information portion of my meeting snippet is pretty simple: description, date, and time.


I use fill-in forms for attendees. Since I work in a small office, I actually do this with an Optional eSlection for my co-workers and a few additional fill-ins for additional attendees. The purpose of these fill-ins is to allow me to use the names again below. Don’t forget how lazy I am.


My meetings often revolve around issues. My notes are typically a few bullet points per issue. This structure has evolved and works for me. It may not for you. You’ll need to get creative here.

The Checklists

I love having checklists from meetings. I love even more when other people know I have checklists. I used to just make it my checklist but now I add checklists for everyone in the meeting. Note how I’ve repeated the fill-in forms here. With checklists—as well as issue lists—I populate the template with many entries. It is much easier to delete than add, particularly on the iPad.

End Time

I like keeping track of how long meetings go. Subconsciously, the fact that I’m going to write down the end time helps me keep things moving, to the extent I have any power over that.

Next Meeting

If I’m really on the ball, at the end of the meeting we’ll agree upon the next meeting date (if necessary) and a preliminary agenda.

After the meeting…

I usually open this snippet in drafts. When the meeting is over, I can email it off to the attendees that have follow up items. I also copy the text and save it my nvALT file for the particular matter the meeting surrounds. On iOS, I can do it through WriteRoom, which is syncing to nvALT on my Mac.

Enjoy and let me know if you’ve got any improvements.

If this snippet is useful, you may also like my conference call snippet.

Download the Meeting Notes Snippet Here.



Easier Conference Call Planning with TextExpander

Organizing conference calls used to be a lot of trouble. It required a pay service, multiple telephone numbers and access codes (that were always changing), and the simple act of getting word out to everyone about the details always took more time than it should have. Times are changing. I recently started using freeconferencecalls.com for conference calls. It’s a great, free service that gives you a single call-in number and access code that never changes. You don’t have to schedule anything with the service. You just send out the number, access code, and time to your call participants and get back to work.


At first I just kept these numbers in my contacts list and used a bit of copy and paste when necessary. After doing this a few times, I realized TextExpander was a much better solution. I’ve now put together a clever little TextExpander snippet that sends out the conference number, access code, and date and time for the call.

I’ve also added a fill-in snippet for the conference call agenda and a pop-up menu for the estimated length of time. I find that if you give people an agenda and time estimate going into a conference call, you’re much more likely to stay on the agenda and complete it within the estimated time.

Now when I have a new conference call to setup, I just open up an email to all the participants, fire off the TextExpander snippet, and send it off. In addition to saving me a lot of time, I think it scares the other participants to the call just a little bit.

I’ve actually got two of these snippets because I have two freeconferencecall.com accounts. One is for the day job (which gets shared with other participants at my office) and the other is for MacSparky.

Here is the snippet in action:

Screen Shot 2013-06-16 at 1.55.21 PM.png

TextExpander touch Snippet Winners

Last week Smile released version 2.0 of TextExpander touch, which I really dig. Yesterday Smile gave me five free download codes to give away for the new app. I put the word out on Twitter to send in favorite snippets for codes and got some really great ones. In fact, I got too many and feel bad about leaving some people out but here comes the winners. Thanks everyone for playing along.

1. MultiMarkdown? Yes thank you.

Sayz Lim submitted a MultiMarkdown snippet to maintain a figure tag in MultiMarkdown. One of the things I like about this snippet is the way he uses the same fill-in snippet twice. I do this often too and I'm not sure everyone knows you can do that.

![ [%filltext:name=Figure Caption%][] ](%clipboard)

[%filltext:name=Figure Caption%]: %clipboard

2. Let Me Know

Trent sent in this simple yet useful script.

ppp = Please let me know if you have any questions.

3. The Breakfast Club Special

Reader Oscar is an educator and needs to send out notices for students that get Saturday detention. He uses this in conjection with an AppleScript that pulls a list of names from a Dropbox text file and works its magic.

The following students have zeros in %fillpopup:name=Classname:Physics:Aquatic Science:default=Forensics% for the week of: %@-9D%m/%d/%y:

%fillarea:name=Student Names%

They need to be assigned to Saturday D-hall on %@+3D%m/%d/%y.

4. Testing, Testing

Michael has a snippet that looks very useful for testing stroke victims. It uses pop ups and several other features. This may not be useful to you but I'm betting there is something in your life that would get easier if you made your own snippet like this one.

NIH Stroke Scale %snippet:.date% %snippet:.time%

1a. Level of Consciousness:%fillpopup:name=1a.:default=0 (Keenly responsive.):1 (Arousable with minor stimulation):2 (Requires strong stimulation):3 (Comatose)%

1b. LOC Questions:%fillpopup:name=1b:default=0  (Answers both questions correctly):1  (Answers one question correctly):2  (Answers neither question correctly)%

1c. LOC Commands:%fillpopup:name=1c:default=0  (Performs both tasks correctly):1  (Performs one task correctly):2  (Performs neither task correctly)%

2.   Best Gaze:%fillpopup:name=2:default=0  (Normal):1  (Partial gaze palsy):2  (Forced deviation)%

3.   Visual:%fillpopup:name=3:default=0  (No visual loss.):1  (Partial hemianopia):2  (Complete hemianopia):3  (Bilateral hemianopia)%

4.   Facial Palsy:%fillpopup:name=4:default=0 (Normal):1 (Minor paralysis):2 (Partial/Central paralysis):3 (Complete paralysis)%

5a. Motor Left Arm:%fillpopup:name=5a:default=0 (No drift for 10 seconds):1 (Drift without touching):2 (Some effort against gravity):3 (No effort against gravity):4 (No movement):0 (Amputation or fusion)%

5b. Motor Right Arm:%fillpopup:name=5b:default=0 (No drift for 10 seconds):1 (Drift without touching):2 (Some effort against gravity):3 (No effort against gravity):4 (No movement):0 (Amputation or fusion)%

6a. Motor Left Leg:%fillpopup:name=6a:default=0 (No drift for 10 seconds):1 (Drift without touching):2 (Some effort against gravity):3 (No effort against gravity):4 (No movement):0 (Amputation or fusion)%

6b. Motor Right Leg:%fillpopup:name=6b:default=0 (No drift for 10 seconds):1 (Drift without touching):2 (Some effort against gravity):3 (No effort against gravity):4 (No movement):0 (Amputation or fusion)%

7.   Limb Ataxia:%fillpopup:name=7:default=0 (Absent):1 (Present in one limb):2 (Present in two limbs):0 (Amputation or fusion)%

8.   Sensory:%fillpopup:name=8:default=0 (Normal):1 (Mild to moderate loss):2 (Severe loss)%

9.   Best Language:%fillpopup:name=9:default=0 (No Aphasia):1 (Mild to moderate):2 (Severe aphasia):3 (Mute or global aphasia)%

10. Dysarthria:%fillpopup:name=10:default=0 (Normal):1 (Mild to moderate):2 (Severe dysarthria):0 (Intubated or other)%

11. Extinction and Inattention:%fillpopup:name=11:default=0 (Normal):1 (To one modality):2 (Profound loss)%

5. The Moxy Award…

… goes to Barry for this.

NTET = Need TextExpander Touch

Are you still waiting to check out TextExpander touch 2.0? Shame on you. You should be watching this clever video.