โ˜• Barista: An Espanso build tool for Unicode connoisseurs

No coffee beans were harmed in the development of this tool.

Photo by Nathan Dumlao

Gone are the days (at least almost) when we lived under the tyranny of the feared American Standard Code for Information Interchange, perhaps better known by its acronym ASCII. The world has (again, largely) changed to the much revered Unicode, but all is not well in encoding paradise.

We are still in the expressive bondage imposed upon us by the finite and inadequate layout of our keyboards. I have a dream that one day, keyboard users will rise up and live out the true potential of the superior encoding. To find freedom in the kind embrace of Unicode.

Our savior is none other than Federico Terzi, our Holy Book nothing less than Espanso. I hope to convince you that Barista may belong in the Gospels, or whatever the equivalent may be in your chosen faith, belief system or lack thereof.

Espanso is text expander that provides an escape from our ASCII nightmare and manages to be performant, privacy-focused, cross-platform, and entirely free and open source. Perhaps the best feature of Espanso is it’s creator โ€“ the diety in the increasingly strenious analogy of this post. Federico Terzi is uniquely friendly and helpful, which is an invaluable quality that is all too rare in the vast world of open source pet projects.

๐Ÿ˜Š Enough with the flattery

Espanso, like most text expanders, works by replacing certain strings of keyboard inputs with something else โ€“ in Espanso you can actually even run scripts or small forms as well, but that is beyond the scope of this post.

This is solves our Unicode input problem in a simple, predictable, and configurable way. With the fair decent unique support of MathJax.

Below is an example of a few expansions I have set up with my Espanso configuration. Whenever I type the match, Espanso automagically replaces it with the replacement.

Match Replacement
:isod 2022-01-21 (today’s date, calculated at time of expansion)
:oint โˆฎ
:bbR โ„
:@ hi@jeppe.science
;b ฮฒ

In fact, my current Espanso setup contains 34015 matches that map to 1666 replacements! I can type pretty much any accented latinised character easily: ฤ…, รฟ, ลง and so on.

๐Ÿค” ยฟWhy?

I can actually also type all the greek letters (and bold, italicised, bold-and-italicsed, sans-serif, sans-serif-bold, sans-serif bold-italic, blackboard bold greek letters). One might, very reasonably, argue that this is entirely excessive and goes far beyond what is reasonable. While this is true to some extent, some physics notation relies on different fonts and bold and italics carry mathematical meaning as well.

One very noticable benefit of using Unicode is that your LaTeX/MathJax source text is infinitely (or should I say: โˆž-ly) more readable. I find math-heavy LaTeX source files to be very disorienting and hard to navigate โ€“ no more!

โ˜• So what was this Barista thing again?

As you can imagine, managing 34015 matches is a daunting task and entirely inappropriate work for a human, which brings us to Barista.

While still poorly documented, Barista is a capable build tool for Espanso configuration files. It allows me to split my matches and replacements across 85 Jsonnet files instead.

๐ŸŽบ Aside: Jsonnet

Jsonnet is a templating language that extends json and allows us to write logic and neat functionality directly in our configuration files! It is super cool, though still fairly immature as a language, and currently the reference implementation is switching from C++ to Go.

๐Ÿ— Barista as a build tool

Barista is essentially just a handy tool for compiling a bunch of Jsonnet files and placing them in a place for Espanso to discover.

Additionally it features some neat functionality like detecting match collisions (though these are less of an issue with Espanso v2) as well as a bunch of Jsonnet library functions that are aimed at making working with Unicode sequences more convenient.

Lastly the default configuration for Barista is my personal setup, but can easily be configured to use different leading and trailing triggers โ€“ something that is not currently supported in the native Espanso configuration files.

Currently Barista compiles my 7376 lines Jsonnet and YAML source files into 41067 lines of rendered YAML, which Espanso uses.

๐Ÿ’ƒ Example of how Barista and Espanso helps me write math

The following identity for the Laplacian of a vector field is a good example of how [Espanos] has massively improved my math writing workflow:

$$ โˆ‡ยฒ \vec F = โˆ‡(โˆ‡ โ‹… \vec F) - โˆ‡ ร— (โˆ‡ ร— \vec F) $$

With Unicode the source text looks like:

โˆ‡ยฒ \vec F = โˆ‡(โˆ‡ โ‹… \vec F) - โˆ‡ ร— (โˆ‡ ร— \vec F)

Without, it looks like:

{\nabla}^2 \vec F =
  \nabla(\nabla \cdot \vec F) -
  \nabla \times (\nabla \times \vec F)

$$ {\nabla}^2 \vec F = \nabla(\nabla \cdot \vec F) - \nabla \times (\nabla \times \vec F) $$

โš  Cautionary note

Barista is still somewhat geared towards my personal setup, but if there is interest I would be happy to polish it a bit more and put it on PyPI.

Jeppe Klitgaard
Jeppe Klitgaard
Physics Student

Just another enthustiastic polymoron thinking out loud.