A text expansion solution in C/C++ that allows the user to auto-expand abbreviations into full strings.


For example, typing ";;ttyl" might expand itself into "Talk to you later", or ";;license" might expand to a license key such as "ejp2RYhgI5p43n80BB311Ck32umDmqoezLkfOJmqIgNvHfux9Wm8bYtZJIA".

Other common use cases are quickly expanding commonly abbreviated words such as:

a11y -> accessibility

i18n -> internationalization

eod -> end of day

I do not recommend using this for expanding programming snippets: there are much better, context-aware solutions around for that. This projects aims to provide a means of allowing quick text expansions across any program. It can be used to speed up data entry, remove the need to memorize phone numbers you don't often use but occasionally need to share (my "office" number, for example, I always access by the abbreviation: ";;office" because I don't ever remember it but occasionally need to provide it to a client).

Want to be able to share that gif really quickly? Just make an abbreviation for it that expands to the URL. Meme at speeds never seen before.

Tired of a colleague that keeps asking the same damn question every week? Make an abbreviation that expands into a full, detailed response in just a few keystrokes so you can get back to work.

This project hopes to improve on existing solutions in a number of ways:

  1. It should be lean and only handle text expansion. I don't need a bloated tool that takes up unnecessary resources. Furthermore, I'd like to create a single executable for the user akin to the way RemedyBG does it.
  2. This project will be Open Source. Building functionality like this literally requires implementing a keylogger. All of the existing solutions I know of are not open source and could be doing anything with my keystrokes, including sending them off somewhere for storage and later username/password analysis. No bueno.
  3. Allow easy sharing of your saved entries. Ideally I hope to have a single config file generated by the executable that the user can then share across machines. This makes it incredibly easy to use something like Dropbox to keep multiple machines in sync.

Example / Demonstration

Consider a configuration with the following abbreviations and expansions created (these are simply typed in!):


That allows you to do the following (.gif capped at 10FPS for size -- real use is much faster):


The source and releases are both available on the GitHub Page.

Recent Activity

&abbrv 1.4 is now released:

This update allows you to mark entries as "hidden" which will obfuscate their values when the application is open by replacing their values with asterisks (*) without affecting insertion functionality. This is mostly helpful for streamers who want to be sure that they don't leak API keys and alike by mistake when expanding the abbrv window.

As always, please open an issue if you run into any problems! Thanks!

&abbrv Just a quick update to these forums that I've released abbrv 1.2 which I'm considering feature complete. I'll happily fix any bugs reported by Issues or entertain the idea of additional functionality if it's requested, but unless that happens I believe the project will remain at 1.2. It meets my needs and I'm pleased with its performance for me thus far. You can see the 1.2 release here:

Nothing new in this gif, just wanted to update the project board and say that I think abbrv made it for a 1.0 (actually 1.1!) release before the jam closes. A very simple project, but ultimately pleased with the progress. Ideally I'd want to make it work for MacOS as well, but for the end of the jam just working on Windows is enough for me. You can grab the release here:

I'd greatly appreciate any/all feedback or bug reports. I figure I'd give this like a week after the jam closes, fix any bugs found and then mark a 1.X release that isn't flagged as beta. &abbrv

Changed the SendInput() API calls around to send one big batch of inputs instead of multiple calls. This makes longer string insertion much faster. &abbrv

A less interesting, but still important, update: we can now ship a single .exe file with fonts and any/all other required pieces embedded in the .exe. Once you add entries, your .exe is joined by config.abbrv that contains all your saved data. Moving data between machines is as simple as copy/pasting that file between them. &abbrv

Some more kinks worked out, input/output seems bugless (so far) and we now support multi-line expansions. Saving and loading works without issue and happens whenever a pair is added, removed or modified. Thanks to Martins I've also resolved a number of Windows System Tray Icon woes! I'm very pleased with this progress so far -- I'll need to start researching the MacOS implementation details starting tomorrow. I assume that'll take a lot more time as I'm far less familiar with that environment... &abbrv

Mostly successful Windows build for &abbrv ! There's still some work to be done on this version, and the entire Mac OS platform layer to do, but I'm very pleased to be so far along already. I think I chose a reasonably sized project for the jam 🙂