This Week's Sponsor:


Ensure that if a device isn’t secure it can’t access your apps.  It’s Device Trust for Okta.

TextExpander Touch 2.0 Brings Fill-In Snippets, Formatted Text To iOS

TextExpander touch 2.0

TextExpander touch 2.0

I rely on Smile’s TextExpander to save keystrokes on my Mac on a daily basis, but the iOS counterpart, TextExpander touch, has always felt vastly underpowered due to limitations imposed by Apple on the iPhone and iPad. Today’s major update, TextExpander touch 2.0, aims at rising the app’s grade of efficiency by introducing several new features that have become must-haves for TextExpander on the Mac. I have been able to test the update for the past month, and it’s already become part of my workflow in interesting (and powerful) new ways.

TextExpander, for those unaware, is a text expansion utility: it takes a pre-defined abbreviation and outputs the full text associated with it. You can use TextExpander to type sig and be presented with your full email signature, so you don’t have to type it every time; adddr for your home address, useful for web forms; or, you can create a snippet called cccard that will be expanded with the number of your credit card. While alternatives have surfaced over the years, I believe TextExpander is the premiere text expansion utility thanks to Smile’s excellent support, frequent update cycle, and advanced feature set on the Mac.

In TextExpander 4, originally released last year, you can go beyond basic abbreviations and text expansions and create complex fill-in snippets that implement macros, optional selections, and even popup menus to generate text boilerplates that are actually based on variables, such as dates. Combined with the app’s support for standard strftime timestamps and script execution, a single TextExpander snippet can trigger visual menus, handle multi-line fill-ins, and manipulate the cursor position or text selection in a current document. If you’re often dealing with text on OS X, I have no doubt you can come up with TextExpander ideas for your workflow.

Prior to today’s update, TextExpander touch could only support a fraction of the Mac version’s functionalities. Due to iOS’ sandboxed nature, TextExpander touch cannot work in any app that accepts text; this is why you can’t type a TextExpander abbreviation in Safari or Apple Mail and receive the full text. To overcome this limitation, Smile created the TextExpander SDK, which has so far enabled over 150 apps to integrate with TextExpander to offer snippet expansion natively on iOS. Some of my favorite iOS apps such as Drafts and Day One allow me to save keystrokes – something that’s even more convenient on iOS.

The problem with TextExpander touch 1.0, however, wasn’t strictly related to its sandboxed nature – it just didn’t have the same amount of features of TextExpander for Mac, resulting in a crippled experience for users who, upon seeing the app on the Store, thought it would work exactly like on OS X. TextExpander touch 2.0, while still limited by sandboxing, takes important steps towards being more similar to TextExpander 4.

The big new feature of TextExpander touch 2.0 is that it allows to more easily create complex snippets directly on an iOS device. The snippet creation process revolves around a new “Insert” menu that lives, alongside the (also new) “Format” option, in the copy & paste menu. Like TextExpander 4, the Insert menu can be used to manage macros for date, time, date/time math, snippets, clipboard, cursor position and selection, and – another fantastic addition of this update – fill-in snippets.

TextExpander touch 2.0

TextExpander touch 2.0

Fill-in snippets are, in my opinion, the most useful feature of TextExpander for Mac. A fill-in snippet takes the basic idea of expanding an abbreviation and augments it with the possibility of mixing a pre-defined string with a “fill-in field” where you can manually type. Essentially, whenever a variable doesn’t cut it and you know the variable depends on you having to type, you can use a fill-in field to, literally, fill in the information yourself. Or, if it’s not about typing but having more than one option, you can use a fill-in snippet to present multiple choices in a popup menu.

Take, for instance, an email template for customer support. If you deal with customers on a daily basis, you likely receive emails that require replies with variables (the customer’s name) and a large amount of recurring text (introductory sentence, signature, product description, answers to common issues, etc). Instead of writing a full email from scratch every time, you can set up a TextExpander fill-in snippet that contains arbitrary text (perhaps with optional sections) and text fields where you can supply the missing information manually. The same idea applies to another task that can be sped up by templates, such as meeting notes. With TextExpander, you can type an abbreviation, such as xmeet, to bring up a popup window containing a dynamically-generated timestamp, a selection of the participants’ names, sections, and a cursor positioned where you need to type your meeting notes. There are some great examples of TextExpander fill-in workflows on the Internet, which I recommend checking out.

In TextExpander touch 2.0, basic features related to text expansion and cursor position remain unchanged. What this update obviates is the need to remember TextExpander’s syntax (which can get confusing with percentages signs and slashes) thanks to a list of macros to choose from. You can use the Date and Time macros to pick a format for timestamps instead of having to type and try strftime-based combinations; in this version, you can select text and use the new “Selection Range” value to tell TextExpander to select a specific portion of text after an expansion.[1]

The same visual approach has been used for formatting expanded snippets, also a new feature in TextExpander touch 2.0. Available in a Format menu next to Insert, snippets can be formatted choosing from a variety of fonts supported by iOS, font weights and sizes, and colors. Because the implementation is native, you can copy rich text created by TextExpander and paste it into apps like Mail without losing your special formatting; the Notes section of TextExpander (where you can try out abbreviations and receive expanded text) now allows you to copy and send rich text via email as well.

TextExpander touch 2.0

TextExpander touch 2.0

I personally have no use for rich text because all my writing is done in plain text, but I imagine users who have been requesting it will appreciate the app’s Format menu, which is concise and easy to use.[2]

I have been able to test TextExpander touch 2.0 in combination with Agile Tortoise’s Drafts, my favorite iOS apps for building automated workflows that involve text and inter-app communication. Thanks to the updated TextExpander touch SDK – released last week – third-party developers can integrate with TextExpander to take advantage of the new fill-in snippets, which, at least based on what I tested, will be handled by the TextExpander app itself. Other regular, non-fill-in snippets will still be expanded inline in the app that supports the TextExpander SDK.

In Drafts 3.0.4, typing an abbreviation for a fill-in snippet will delete the abbreviation and take you to TextExpander automatically; in TextExpander, you’ll be presented with a window for the fill-in snippet where you can type or select options from popup menus; after you hit Done, you’ll be taken back to Drafts, which will display the full expanded text of the fill-in snippet. In the new SDK, communication between apps is built on top of the x-callback-url protocol.

I am still experimenting with ideas for fill-in snippets on iOS, but I have already set up three that I use constantly. They are all activated by Drafts, which was the only app that supported the new TextExpander touch SDK during my testing.

My first two fill-ins prepare a template for a daily summary that I can send to Day One using Drafts. Day One is one of my favorite apps for OS X and iOS, and while I have tried to scrupulously write down my thoughts for each day of my life, there’s always the day when I forget to write my log or simply don’t have time to jot down thoughts on my iPhone or iPad. At the same time, since I started exercising every day, I wanted a way to keep track of my workout stats without having to rely on another app. Day One was the perfect candidate for a fill-in snippet aimed at assembling a daily template.

TextExpander touch 2.0

TextExpander touch 2.0

The first fill-in prepares a three-line summary of my day: the first line lets me specify what I did (“stayed at home”, “went to Rome”, “went to the doctor”, “worked a lot”, blank option), asks me what kind of day it was (“normal”, “good”, “bad”, “excellent”) and repeats that value as a hashtag that Day One recognizes as a tag.

There’s a couple of tricks worth noting in this fill-in. The cursor is positioned after a space at the end of the first line so that, after expansion, I can start typing right away if I have anything to add (and I usually do); if I choose the blank option (because my day didn’t meet any of the fill-in criteria), I only have to hit backspace and type (two spaces will be inserted with the blank option). Second, note how the TextExpander syntax allows you to set default options for popup menus that will be pre-selected when you fire off a snippet; I default my fill-in to “good day” both in the second line and hashtag, because I’m always optimistic.

TextExpander touch 2.0

TextExpander touch 2.0

To remember to write my Day One entry, I use a Launch Center Pro scheduled notification that launches Drafts every day at 10 PM.

TextExpander touch 2.0

TextExpander touch 2.0

A limitation of the TextExpander SDK in Drafts 3.0.4 is that abbreviations need to be manually typed by the user in order to trigger a snippet; you can’t launch Drafts with a URL scheme that contains your abbreviation (pre-filling the Drafts compose area) because that won’t be expanded (and won’t launch TextExpander if it’s a fill-in). Recognizing abbreviations in strings passed by URL schemes would contribute to better integrating TextExpander in iOS workflows for sharing and manipulating text across apps[3]; considering how Greg Pierce had to enable a similar option in Drafts 3.0[4], my hope is that developers will find a way to eschew the need of typing abbreviations. For now, I have to remember the abbreviations I have to type, so I have added Day One’s in the name of the Launch Center Pro notification.

The second Day One template uses a fill-in to keep track of how many crunches I do every day. The first line generates a timestamp to see when I finished exercising; I use the Time macro here, and I don’t care about Date because Day One takes care of that anyway. The following lines contain two single-line fill-ins to enter the amount of crunches and side crunches I did. Alas, TextExpander doesn’t let you specify the kind of keyboard you want to see by default – in this case, it would be perfect to have a Launch Center-like numeric keyboard for fill-ins. The last line of the snippet uses another hashtag that I can later browse in Day One to see how consistent and diligent I am with my exercising. Last, the full text is sent back to Drafts, which forwards it to Day One using the built-in action to create a new entry.

TextExpander touch 2.0

TextExpander touch 2.0

I am quite fond of the fill-in snippets for Day One. I’ve gotten used to them extremely quickly and it’s hard for me to think that TextExpander touch didn’t support this kind of functionality before. These simple snippets are helping me use Day One more on iOS, facilitating text input and removing friction without compromising the nature of the things I want to write in Day One.

My third fill-in snippet helps me launch site-specific Google searches through Chrome. Using a sss abbreviation, I can launch TextExpander, type my Google query, choose from a list of sites that I typically read, go back to Drafts, and open in Chrome.

TextExpander touch 2.0

TextExpander touch 2.0

Alongside string expansion in URL schemes, another improvement that I’d like to see in Drafts 3.0.4 would be the possibility to chain actions to snippet expansion. Right now, I am forced to type an abbreviation, get back to Drafts, and tap an action; in the future, I’d like to build workflows that can tell Drafts “after you receive the expanded text, launch this action automatically”.

Similarly, now that TextExpander uses x-callback-url, it would be nice to enable users to build their own URLs to launch TextExpander and pass expanded text to other apps or actions with x-success. And speaking of actions, I would go a step further and suggest that I would also welcome an option to call TextExpander’s built-in Mail and Copy actions via URL scheme (they are not scriptable in 2.0).

There are some things that I don’t like in TextExpander touch 2.0. UI polish was never Smile’s strong suit, but the look of fill-in snippets clashes badly with the standards we’re used to on iOS; I would like to see a revamped look for both the title bar and fill-in snippets themselves. The snippet editor, while improved, isn’t as functional as the Mac’s one, primarily because of the lack of smart recognition for macros, which still forces you to manually edit text of macros inside a snippet.[5] Looking ahead, I would like to see a way to build popup menus using variables as options, not just pre-defined text.[6]

TextExpander touch still isn’t as powerful and polished as TextExpander 4, but it’s gotten closer with today’s major update. Some of its limitations can’t be overcome unless Apple makes profound changes to iOS’ architecture; others could be fixed and improved by Smile.

Fill-in snippets and a new editor make TextExpander touch 2.0 a fantastic new version of TextExpander that I highly recommend. I look forward to seeing how third-party developers will integrate with the new SDK – TextExpander is now an impressive time-saving utility, but its strength lies in the developer community.

TextExpander touch 2.0 is available on the App Store.

  1. Text selected via TextExpander snippets won’t automatically display the iOS copy & paste menu. ↩︎
  2. TextExpander support in Apple Mail would be perfect for inserting rich text signatures. One can dream, right? ↩︎
  3. Think about the possibilities: if Greg Pierce figured out a way to expand snippets from incoming URL schemes, you could, in theory, create a workflow that takes Safari’s selected text with a bookmarklet on the iPad, sends it to Drafts alongside an abbreviation, which fires up TextExpander to surround the webpage text with variables like date and time, and sends it back to Drafts – with one tap. ↩︎
  4. For TextExpander snippets used in URL actions. App Cubby coded the same feature into Launch Center Pro 1.1. ↩︎
  5. On the Mac, clicking anywhere on a macro automatically brings up a popover with menus to aid you in creating and re-arranging macros. ↩︎
  6. I wanted to build a fill-in snippet that presented a popup menu with options generated by date/time math macros. Basically, my idea was to create options that added 1, 6, 12, and 24 hours to the current date and displayed them inside a fill-in popup. Alas, I don’t think there is a way to include macros or snippets inside a popup. Therefore I ended up choosing the “in 6 hours” verbose format, which is recognized by apps like Due and Fantastical, but that isn’t the dinamycally-generated timestamp I was looking for. ↩︎

Unlock More with Club MacStories

Founded in 2015, Club MacStories has delivered exclusive content every week for over six years.

In that time, members have enjoyed nearly 400 weekly and monthly newsletters packed with more of your favorite MacStories writing as well as Club-only podcasts, eBooks, discounts on apps, icons, and services. Join today, and you’ll get everything new that we publish every week, plus access to our entire archive of back issues and downloadable perks.

The Club expanded in 2021 with Club MacStories+ and Club Premier. Club MacStories+ members enjoy even more exclusive stories, a vibrant Discord community, a rotating roster of app discounts, and more. And, with Club Premier, you get everything we offer at every Club level plus an extended, ad-free version of our podcast AppStories that is delivered early each week in high-bitrate audio.

Choose the Club plan that’s right for you:

  • Club MacStories: Weekly and monthly newsletters via email and the web that are brimming with app collections, tips, automation workflows, longform writing, a Club-only podcast, periodic giveaways, and more;
  • Club MacStories+: Everything that Club MacStories offers, plus exclusive content like Federico’s Automation Academy and John’s Macintosh Desktop Experience, a powerful web app for searching and exploring over 6 years of content and creating custom RSS feeds of Club content, an active Discord community, and a rotating collection of discounts, and more;
  • Club Premier: Everything in from our other plans and AppStories+, an extended version of our flagship podcast that’s delivered early, ad-free, and in high-bitrate audio.