Oft verwendet man beim Schreiben immer wiederkehrende Textbausteine, sei es der eigene Name, Höflichkeitsfloskeln in der E‑Mail-Korrespondenz oder Code-Snippets. Damit man diese Textbausteine nicht immer wieder eintippen muss, gibt es so genannte Textexpander, die z.B. das Kürzel “mfg” mit dem Text „Mit freundlichen Grüßen” ersetzen. Apple hat dafür ein Tool in das MacOS integriert, dass sich in den Systemeinstellungen → Tastatur → Textersetzungen versteckt. Allerdings hat diese integrierte Funktion ihre Grenzen: Ersetzungen sind auf nur eine Zeile begrenzt und funktionieren nicht in jedem Programm – zum Beispiel verweigert Google im URL/Suchfeld solche Ersetzungen.
Es gibt diverse Alternativtools, die zusätzliche Funktionen bieten. Für den Mac gibt es beispielsweise Keyboard Maestro und die Alfred App. Beide gehen in ihren Möglichkeiten weit über die Textersetzung hinaus, kosten daher auch etwas. Ich nutze zwar Alfred, finde aber die Textersetzungen darin etwas kompliziert. Daher suchte ich ein Tool, das etwas einfacher in der Handhabung ist, aber auch nicht unbedingt so mächtig wie die Alfred.
Bei meinen Recherchen bin ich dann auf Espanso gestoßen, das nicht nur kostenlos, sondern auch für Windows und Linux verfügbar ist. Sogar der OpenSource-Code ist auf GitHub verfügbar. Espanso bietet zwar keine grafische Oberfläche für die Konfiguration und im laufenden Betrieb nur vier Funktionen in einem Menüleisteneintrag, aber mit ein wenig Einarbeitung ist die Konfiguration zu meistern und dann steht einer komfortablen Textersetzung nichts mehr im Wege.
Installation
Espanso kann auf dem Mac auf verschiedene Weisen installiert werden. Eine Möglichkeit ist über Homebrew, was besonders praktisch ist, wenn dieser Package-Manager schon für Linux/Unix-Kommandos im Einsatz ist. Alternativ kann das Zip-Archiv, für den Intel Prozessor oder für Apple Silicon, direkt von der Espanso-Webseite heruntergeladen werden. Nach dem Entpacken bewegt man die Programmdatei einfach in den Programmordner. Für Windows-Nutzer steht sowohl eine reguläre als auch portable Version zur Auswahl, und für Linux sind diverse Pakete je nach Distribution verfügbar. Persönlich hatte ich beim Versuch, Espanso unter Ubuntu zu installieren, keinen Erfolg.
Ist Espanso im Programmordner platziert, kann es gestartet werden. Ein Dialog informiert darüber, dass die App aus dem Internet stammt. Durch einen Klick auf „Öffnen” wird dies bestätigt und Espanso startet den Installationsprozess. Aufgrund seiner Funktionsweise, speziell bei den Textersetzungen, müssen einige Einstellungen im System bestätigt werden.
Möchte man, dass Espanso nach einem Neustart des Systems automatisch startet, sollte die entsprechende Option aktiviert bleiben. Andernfalls muss man Espanso manuell aus dem Programmordner heraus starten.
Diese Meldung ist die Bestätigung dafür, dass Espanso ab sofort beim Systemstart mit gestartet wird und dann im Hintergrund läuft.
Eine weitere Einstellung sorgt dafür, dass Espanso einfach über das Terminal gesteuert werden kann.
Bevor das Programm vollständig funktioniert, muss noch ein Script genehmigt und ausgeführt werden, um Espanso in den Datenschutz- und Sicherheitseinstellungen unter „Bedienungshilfen” die Steuerung des Computers zu ermöglichen, wodurch Espanso dann die Texte erst ersetzten kann.
Sobald diese Einstellungen vorgenommen sind, ist Espanso betriebsbereit. Ein Symbol in der Menüleiste ermöglicht den direkten Zugriff auf einige der Funktionen von Espanso.
Grundlegende Anwendung
Nachdem Espanso installiert wurde, muss es erst konfiguriert werden. In der Grundkonfiguration bietet eine Bespiele für Ersetzungsregeln. Wenn man in einem Texteditor :espanso
eingibt, wird es durch “Hi there!” ersetzt, und :date
zeigt das aktuelle Datum in dem Format 10/30/2023.
Um es nach den eigenen Bedürfnissen zu personalisieren, müssen eigene Ersetzungen erstellt werden. Dazu definiert man einen „Trigger”, wie in dem Beispiel :espanso
, und die zugehörige Ersetzung, das „Replace”, in diesem Fall Hi there!
. Diese Definitionen werden in einer YAML-Textdatei hinterlegt. Das sieht zwar etwas altmodisch aus, hat aber den Vorteil, dass die erstellten Regeln sehr einfach auf andere Computer mit anderen Betriebssystemen oder mit Familie, Freunden und Kollegen ausgetauscht werden können. Die Konfiguration für die Beispiele sieht wie folgt aus:
# espanso match file
# For a complete introduction, visit the official docs at: https://espanso.org/docs/
# You can use this file to define the base matches (aka snippets)
# that will be available in every application when using espanso.
# Matches are substitution rules: when you type the "trigger" string
# it gets replaced by the "replace" string.
matches:
# Simple text replacement
- trigger: ":espanso"
replace: "Hi there!"
# NOTE: espanso uses YAML to define matches, so pay attention to the indentation!
# But matches can also be dynamic:
# Print the current date
- trigger: ":date"
replace: "{{mydate}}"
vars:
- name: mydate
type: date
params:
format: "%m/%d/%Y"
Auf dem Mac befindet sich die Konfigurationsdatei unter ~/Library/Application Support/espanso/match/base.yml
. Diese sollte mit einem reinen Texteditor bearbeitet werden, so ist von der Nutzung von TextEdit abzuraten ist, da es nicht standardmäßig reine Textdateien erstellt. Empfehlenswerte Texteditoren sind Sublime (Testmodus ohne Limit), Textmate (kostenlos), Visual Code (kostenlos), BBedit (kostenloser Modus) oder Terminal-basierte Editoren wie pico
, nano
oder vim
.
Ich persönlich empfehle Textmate. Es ist nicht so komplex wie Visual Code und im Gegensatz zu BBedit und Sublime kostenlos. Wichtig ist, dass man nach der Installation in den Einstellungen den Shell-Support aktiviert. Beim ersten Öffnen einer YAML-Datei wird man außerdem gefragt, ob man den YAML-Support installieren möchte, was man bestätigen sollte. Außerdem sollte der Einzug bei der Verwendung von der Tab-Taste auf 2 Leerzeichen gesetzt werden. Diese Einstellung kann am unteren Fensterrand des Editors vorgenommen werden.
Nach der Aktivierung kann das Terminal geöffnet werden, welches sich im „Programme”-Ordner unter „Dienstprogramme” befindet. Um die Konfigurationsdatei zu bearbeiten, gibt man espanso edit
im Terminal ein, was standardmäßig (zumindest in meiner MacOS Installation) den pico
Editor aufruft.
Beim Bearbeiten dieser Datei muss die Struktur beibehalten werden. Es ist wichtig, darauf zu achten, dass die Einrückungen genau denen entsprechen, wie sie auf dem Bild und im Code-Block oben angegeben sind. Das Wort matches
nach dem ersten Kommentarblock sollte ganz am Anfang der Zeile positioniert sein. Die Einrückungen in den folgenden Zeilen werden durch zwei Leerzeichen erzeugt, für den Textmate Editor könnte man, wie oben gezeigt, die Tab-Taste entsprechend umkonfigurieren. Wenn etwas verrückt wurde, gibt Espanso in der Regel eine Meldung aus, wenn die fehlerhafte Datei geladen wird.
Sollte ein anderer Editor gewünscht werden, so befindet sich die Datei unter folgendem Pfad:
'/User/name_des_user/Library/Application Support/espanso/match/base.yml'
Wie bereits erwähnt, ist die Struktur grundsätzlich recht einfach. Zunächst wird der - trigger:
definiert, gefolgt von der Ersetzung in der nächsten Zeile, also dem replace:
. Die einfachste Form der Ersetzung, nämlich der „Simple text replacement”, lässt sich am Beispiel des Triggers espanso
veranschaulichen:
# Das folgende 'matches:' steht nur einmal am Anfang und veranschaulicht die Einrückungen
matches:
- trigger: ":espanso"
replace: "Hi there!"
Eine etwas komplexere Regel stellt die zweite Regel in dieser Standardkonfiguration dar:
# Gibt das aktuelle Datum aus
- trigger: ":date"
replace: "{{mydate}}"
vars:
- name: mydate
type: date
params:
format: "%m/%d/%Y"
In diesem Beispiel wird die Regel für den Trigger :date
definiert. Der Trigger wird durch den Inhalt der Variable mydate
ersetzt. Dieser Inhalt wird unter dem Schlüsselwort vars
definiert. Die Variable mydate
ist vom type: date
und enthält zusätzlich einen Parameter, welcher das Format des Datums bestimmt. Damit wird der Variablen dann das aktuelle Datum zugewiesen. Zum dritten Beispiel werde ich im Folgenden näher eingehen.
Zwei Schritte sollte man zu Beginn durchführen. Erstens, eine Regel erstellen, die das Konfigurationsfile in Textmate öffnet, falls man mit dem Editor im Terminal nicht zurecht kommt. Und zweitens, die vorhandene Regel für :date
so anpassen, dass sie nicht :date
durch 10/30/2023
, sondern durch 30.10.2023
ersetzt. Für die Änderung um mit Textmate die Konfigurationsdatei zu öffnen, habe ich die Regel für :espanso geändert und den replace:-Teil angepasst. Dazu öffnet man, falls noch nicht geschehen, die Konfigurationsdatei im Terminal mit dem Befehl espanso edit und navigiert mit den Pfeiltasten zum „H” von „Hi there! Dort ersetzt man den Text durch den entsprechenden Kommandozeilenbefehl. Für Textmate sieht die Regel dann so aus, wobei der Text hinter dem replace eine Zeile ist:
# Simple text replacement
- trigger: ":espanso"
replace: "mate ~/Library/Application\\ Support/espanso/match/base.yml"
Für sublime ersetzt man mate
durch subl
und für Visual Code durch code
. Der doppelte Backslash \\
ist erforderlich, um auf der Kommandozeile einen einfachen Backslash darzustellen; ohne diesen zusätzlichen Backslash würde der erste gar nicht angezeigt.
Die zweite Anpassung ist ebenfalls rasch erledigt: Man ersetzt das Format "%m/%d/%Y"
durch "%d.%m.%Y"
.
Anschließend speichert man die Datei mit der Tastenkombination Ctrl‑X gefolgt von Ctrl‑Y. Sollte beim Editieren der Datei ein Fehler unterlaufen sein (beispielsweise durch ein überflüssiges Leerzeichen), gibt Espanso in der Regel eine Meldung aus.
Wenn alles geklappt hat und man nun :espanso in ein Terminalfenster eingibt, wird der Befehl zum Öffnen eingefügt und durch Drücken der Return-Taste die Konfigurationsdatei im Textmate Editor angezeigt. Das funktioniert natürlich auch in jeder anderen Textbox, wobei dann der Befehl mate ~/Library/Application\ Support/espanso/match/base.yml erscheint, aber natürlich nicht gestartet werden kann. Auch :date
zeigt nun das richtige Datumsformat 03.11.202
an, egal in welchen Texteingabefeld :date
eingegeben wird, auch in der Google URL/Such-Eingabe.
Der Doppelpunkt vor dem Trigger-Wort gehört nicht zur Syntax bei der Definition einer Regel. Man kann ihn sogar weglassen, wenn eine Zeichenfolge gewählt wird, die sonst nie in Texten vorkommt. Es ist aber besser ein anderes Zeichen in den Trigger zu integrieren, um sicherzustellen, dass nicht doch an irgendeiner Stelle eine Ersetzungsregel zuschlägt. Wenn beispielsweise hml
der Trigger für Hans Müller Ludenscheid
ist, könnte unter ;hml
der Link zu seiner Webseite aufgerufen werden, oder &hml die Adresse usw..
Mit dieser kurzen Einführung kann man bereits beginnen, einfache Textersetzungen zu definieren. Zum Beispiel Regeln für Namen, die Email-Adressen oder URLs von Webseiten, die man häufig tippen muss.
Komplexere Konfigurationen
In diesem Abschnitt gehe ich tiefer auf komplexere Regeldefinitionen ein. Die Entwickler von Espanso definieren verschiedene Typen von Ersetzungsregeln und Syntaxen, um präzisere Ersetzungen zu ermöglichen:
- Statische Regeln
- Dynamische Regeln
- Globale Variablen
- Wortergänzungen
- Übernahme von Großbuchstaben
- Cursor-Platzierung
- Regel-Auswahl (Match Disambiguation)
- Bezeichnerdefinition für den Suchdialog
- Regeln mit mehreren Triggern
- Regel für Bildersetzung
- Verschachtelte Regeln
- Formulare
Statische Regeln
Ein Beispiel für eine einfache statische Regel wurde bereits an Hand der Auslieferungsdatei demonstriert, hier ein weiteres Beispiel:
- trigger: "hml"
replace: "Herr Müller Lüdenscheidt"
Wie erwähnt könnte man beispielsweise mit ;hml
die Adresse von dem Herren in ein Dokument einfügen:
- trigger: ";hml"
replace: "Herr Müller Lüdenscheidt, Beispielsstraße 7, 80331 München"
Damit wird ;hml
durch Herr Müller Lüdenscheidt, Beispielsstraße 7, 80331 München
in einer Zeile ersetzt. Aber eigentlich wünscht man sich oft die Adresse in mehreren Zeilen:
Herr Müller Lüdenscheidt
Beispielsstraße 7
80331 München
Für diese mehrzeilige Ausgabe bietet Espanso zwei Methoden an. Die erste verwendet das Steuerzeichen \n
für einen Zeilenumbruch:
- trigger: ";hml"
replace: "Herr Müller Lüdenscheidt\nBeispielsstraße 7\n80331 München"
oder, etwas übersichtlicher, mit der folgenden Struktur:
- trigger: ";hml"
replace: |
Herr Müller Lüdenscheidt
Beispielsstraße 7
80331 München
Wenn man die Lesbarkeit in der Definition schätzt, doch die Ausgabe in einer Zeile schätzt, kann man die folgende Regel verwenden:
- trigger: ";hml"
replace: >
Herr Müller Lüdenscheidt,
Beispielsstraße 7,
80331 München
Daraufhin wird ;hml
wieder durch Herr Müller Lüdenscheidt, Beispielsstraße 7, 80331 München
ersetzt.
Hinweis: Wie schon mehrfach erwähnt, Espanso ist sehr genau, wenn es um die Syntax von YAML geht. Es dürfen keine Tabs oder andere Zeichen an unerwünschten Stellen vorkommen. Obwohl Espanso bei falschem YAML Fehlermeldungen ausgibt, sind diese nicht immer präzise. Hier können YAML-Syntax-Checker wie z.B. YAMLlint — The YAML Validator nützlich sein, da sie Fehler genauer lokalisieren.
Dynamische Regeln
Dynamische Regeln unterscheiden sich von statischen Regeln dadurch, dass sie nicht ein Kürzel durch einen vorgegebenen Text, sondern durch einen zum Zeitpunkt der Eingabe erstellten Text ersetzen. Diese Texte können das aktuelle Datum sein oder das Ergebnis eines Shell-Befehles. Der Trigger :date
, das durch 31.10.2023
ersetzt wird, ist hierfür ein gutes Beispiel. Solche dynamischen Regeln sind besonders hilfreich, wenn aktuelle Informationen wie Datum, Zeit oder Systemdaten in die Eingabe integriert werden sollen. Solche Informationen können durch die Einbindung von Shell-Befehlen erstellt werden. Im nächsten Beispiel zeigt wie durch den Trigger :wetter
die aktuelle Wetterinformation aus dem Internet bezogen werden:
- trigger: ":wetter"
replace: "{{output}}"
vars:
- name: output
type: shell
params:
cmd: "curl 'wttr.in/?format=4'"
Nun wird :wetter
durch die aktuelle Wettervorhersage, mit Bruchsal Germany: ☁️ 🌡️+11°C 🌬️↗17km/h
, ersetzt.
Globale Variablen
Globale Variablen sind Variablen, die in verschiedenen Regeln wiederverwendet werden können. Sie werden außerhalb der Regeldefinitionen deklariert. Ein Vorteil dabei ist, dass man nicht bei jeder Regel dieselbe Variable erneut definieren muss, sondern sie zentral an einem Ort festlegt und dann bei Bedarf in mehreren Regeln aufruft.
Ein Beispiel für solch eine globale Variable könnte sein:
global_vars:
- name: "terminal"
type: "shell"
params:
cmd: "echo Hey"
- name: "greet"
type: "echo"
params:
echo: "Hey"
# Regeln, die globale Variablen verwenden
matches:
- trigger: ":hello"
replace: "{{greet}} Jon"
- trigger: ":terminal"
replace: "{{terminal}} Jon"
In diesem Beispiel haben beide Regeln Zugriff auf die globalen Variablen und können diese in ihren Ersetzungen verwenden.
Ein weiteres Beispiel zeigt die Verwendung einer globalen Variable, um Wetterdaten dynamisch zu integrieren:
global_vars:
- name: "wetter"
type: "shell"
params:
cmd: "curl 'wttr.in/?format=4'"
matches:
- trigger: ":moin"
replace: "Hallo Jon, das Wetter ist {{wetter}}"
Durch die Eingabe von :moin
wird eine Begrüßung ausgegeben, die das aktuelle Wetter enthält: Hallo Jon, das Wetter ist in Bruchsal Germany: ☁️ 🌡️+11°C 🌬️↗17km/h
.
Wort Ergänzungen
Wort Ergänzungen ist eine Möglichkeit, dass typische Tippfehler korrigiert werden. Da mir für dieses Feature kein besseres deutsches Beispiel einfällt, nehme ich das aus der Dokumentation.
Also falls man im englischen oft ther statt there schreibt, also das “e” vergisst, kann natürlich eine Regel definiert werden, die ‘ther’ mit there
ersetzt.
- trigger: "ther"
replace: "there"
Allerdings würde sie auch andere Vorkommnisse von ‘ther’ reagieren und so würde other
beim Tippen othere
werden. Im dies zu vermeiden, kann die Regel um das Attribut word:
mit true
ergänzt werden, dadurch wird die Regel immer auf ein ganzes Wort angewandt.
- trigger: "ther"
replace: "there"
word: true
Großbuchstaben Übernahme
Die Definition von einer Ersetzungsregel nimmt ohne eine spezielle Massnahme, keine Rücksicht auf die Groß/Kleinschreibung. Die folgenden Definition von :ht
wird das Wort heute
immer klein schreiben, auch am Anfang eines Satzes.
- trigger: ":ht"
- replace: "heute"
Durch das Setzten des Attribut propagate_case
auf true
kann man die Groß/Kleinschreibung aber steuern.
- trigger: ":ht"
replace: "heute"
propagate_case: true
Nun wird aus :ht
heute
, aber :Ht
wird durch Heute
ersetzt und, falls gewünscht wird sogar aus :HT
sogar HEUTE
.
Wenn mehreren Worten im replace
angegeben sind, wie in dieser Definition,
- trigger: ":hies"
replace: "heute ist es sonnig"
propagate_case: true
wird :hies
ersetzt durch heute ist es sonnig
und aus :Hies
wird Heute ist es sonnig
, aber aus :HIES
wird dann HEUTE IST ES SONNIG
.
Wenn sichergestellt werden soll, dass alle Wörter mit Großbuchstaben ersetzt werden sollen muss ein weiteres Attribut gesetzte werden:
replace: "heute ist es sonnig"
uppercase_style: "capitalize_words"
propagate_case: true
So wird dann aus :Hies
dann Heute Ist Es Sonnig
Cursor Platzierung
Oft ist es ganz praktisch, wenn nach einer Ersetzung der Cursor nicht am Ende des Textes steht, sondern an einer bestimmten Stelle in der Ersetzung. Ein Beispiel aus dem Bereich des Editieren von Obsidian Dateien. Ich benutze beim Schreiben dieses Textes oft einen Codeblock, der mit drei backticks eingeführt wird und ebenso endet. Ich habe mir eine Regel erstellt, die die genau so einen Codeblock erstellt.
- trigger: ":3b"
replace: |
```
```
Allerdings ist der Cursor nach der Ersetzung hinter dem Block und ich muss ihn erst wieder in den Block positionieren. Aber auch dieses Problem ist einfach zu lösen, in dem in die leere Zeile zwischen den Backticks $|$
eingefügt wird. Diese Zeichenkette definiert, wo der Cursor steht, wenn der Text eingefügt wurde.
- trigger: ":3b"
replace: |
```
$|$
```
Regel-Auswahl
Die Möglichkeit, denselben Trigger mit unterschiedlichen Ersetzungen zu verwenden, bietet erhebliche Flexibilität. Wenn man zum Beispiel unterschiedliche Zitate oder Signaturen schnell zur Hand haben möchte, muss man sich nicht an unterschiedliche Trigger erinnern. Stattdessen kann man einen einzigen Trigger verwenden und dann aus den vorgeschlagenen Ersetzungen wählen. Dies ist besonders praktisch, wenn man viele Ersetzungen zu einem bestimmten Thema hat, aber nicht für jede eine eigene Tastenkombination oder ein eigenes Schlüsselwort merken möchte.
- trigger: ":zitat"
replace: "Diejenigen, die verrückt genug sind zu denken, sie könnten die Welt verändern, sind diejenigen, die es tun."
- trigger: ":zitat"
replace: "Kreativität bedeutet einfach, Dinge zu verbinden.“"
- trigger: ":zitat"
replace: "Gute Designer kopieren, große Designer stehlen."
Bezeichnerdefinition für den Suchdialog
Der Suchdialog ist eine nützliche Funktion, wenn man viele Ersetzungen in Espanso definiert hat und nicht mehr alle Trigger im Kopf behalten kann. Mit Hilfe der Label-Funktion kann man zusätzliche Beschreibungen zu jeder Ersetzung hinzufügen, sodass man nicht nur nach dem Trigger, sondern auch nach einer Beschreibung suchen kann. Dies macht es einfacher, die gewünschte Ersetzung zu finden, insbesondere wenn man mehrere ähnliche Trigger hat.
- trigger: ":wetter"
replace: "{{output}}"
label: "Fügt da aktuelle Wetter vom Standort ein"
vars:
- name: output
type: shell
params:
cmd: "curl 'wttr.in/?format=4'"
Regeln mit mehreren Triggern
Manchmal kann es auch ganz praktisch sein, einer Ersetzungsregel über mehrere Trigger aufzurufen. Statt mehrere Regeln zu definieren, geht das auch in einer. Damit kann das aktuelle Wetter mit :wetter aber auch mit :weather
eingesetzt werden.
- trigger: [":wetter", ":weather"]
replace: "{{output}}"
label: "Fügt da aktuelle Wetter vom Standort ein"
vars:
- name: output
type: shell
params:
cmd: "curl 'wttr.in/?format=4'"
Entschuldigung für das Missverständnis. Ich werde nun versuchen, näher am Originaltext zu bleiben und den bereitgestellten Code beizubehalten.
Verschachtelte Regeln
Espanso bietet die Möglichkeit, verschachtelte Regeln zu definieren. Persönlich bin ich mir noch unsicher über den praktischen Nutzen dieser Art der Definition, aber hier ist das Beispiel direkt aus der Dokumentation:
- trigger: ":one"
replace: "nested"
- trigger: ":nested"
replace: "This is a {{output}} match"
vars:
- name: output
type: match
params:
trigger: ":one"
Wenn man :nested
eintippt, wird dies durch den Text „This is a nested match” ersetzt. Das Wort „nested” stammt aus der Regeldefinition des Triggers :one
. Es wirkt fast so, als würde man eine Variable definieren. Wenn jemand einen spannenden Anwendungsfall für dieses Feature kennt, bitte in den Kommentaren teilen.
Formulare
Mit Espanso können auch Formulare definiert werden. Das bietet eine komplexere Möglichkeit, Ersetzungen mit vielen Argumenten zu gestalten. Hier ein einfaches Beispiel:
- trigger: ":birth"
form: |
Hallo [[name]],
Herzlichen Glückwunsch!
Wenn man :birth
eintippt, erscheint ein Dialog mit einem Eingabefeld für den Namen:
Gibt man z.B. „Heinz” ein und bestätigt, wird folgender Text generiert:
Hallo Heinz,
Herzlichen Glückwunsch!
Es gibt noch viele weitere Optionen bei der Verwendung von Formularen, z. B. Listenboxen oder Dropdown-Menüs. Bei Interesse empfehle ich einen Blick in die Online-Dokumentation.
Erweiterungen
Erweiterungen bieten in Espanso zusätzliche Möglichkeiten, vor allem für dynamische Regeln. Dazu gehören Datum, Auswahl, Zufall, Form, Echo und Shell Erweiterungen, die schon teilweise in den Beispielen vorkamen. Ich will hier nur kurz auf die Clipboard- und Script-Erweiterung eingehen.
Clipboard Erweiterung
Die Clipboard-Erweiterung ermöglicht die Integration des aktuellen Inhalts der Zwischenablage in die Ersetzungsregel. Ein praktisches Anwendungsbeispiel wäre das Einfügen einer URL einer Webseite, die in die Zwischenablage kopiert wurde in ein HTML-Dokument:
- trigger: ":a"
replace: "<a href='{{clipboard}}' />$|$</a>"
vars:
- name: "clipboard"
type: "clipboard"
Script Erweiterung
Die Script-Erweiterung eröffnet eine Vielzahl komplexerer Möglichkeiten der Textersetzung. Mit einem einfachen Schlüsselwort kann ein komplexes Script gestartet werden, dessen Ausgabe in den Text eingefügt wird.
Laut Dokumentation kann nahezu jede Skriptsprache verwendet werden. Einzige Voraussetzung sollte sein, dass das Skript auf der Kommandozeile ausführbar ist und das Ergebnis auch dort als Text ausgibt. Hier ein Beispiel, in dem ein Python Script.py ausgeführt und das Ergebnis anstelle des Triggers angezeigt wird:
- trigger: ":pyscript"
replace: "{{output}}"
vars:
- name: output
type: script
params:
args:
- python3
- /path/to/your/script.py
Packages
Packages sind Regeldefinitionen, die von der Community zur Verfügung gestellt werden und im Espanso Hub zu finden sind. Als Beispiel hier ein Package, das eine Reihe von nützlichen Ersetzungsregeln für die Eingabe spezieller Apple-Symbole bietet.
Durch den Befehl:
espanso install apple-symbols
wird das Paket installiert und steht sofort zur Verfügung. Für Mac-Benutzer ist es sehr praktisch, nur noch :cmd
zu tippen, um das ⌘
Command-Zeichen zu erhalten. Vorsicht ist jedoch bei der Installation geboten, denn Regeldefinitionen können Shell-Befehle oder Skripte auslösen, die nicht immer harmlos sein müssen. Außerdem kann es auch passieren, dass bereits definierte Trigger Namen in einem Package erneut verwendet werden. Im genannten Beispiel löste die Regel :alt > ⌥
meine zuvor definierte Regel :a > <a href=':alt > ⌥' > </a>
aus.
Auch wenn man mit den Regeln nicht ganz einverstanden ist, können diese Packages zumindest als Ideengeber und Steinbruch dienen. Ein Blick in den Hub lohnt sich.
Konfigurationsdateien
Espanso arbeitet mit Konfigurationsdateien, die sich im Espanso-Ordner befinden. Mit dem Befehl espanso path
lässt sich der genaue Pfad dieses Ordners ermitteln.
~% espanso path
Config: /Users/leifjp/Library/Application Support/espanso
Packages: /Users/leifjp/Library/Application Support/espanso/match/packages
Runtime: /Users/leifjp/Library/Caches/espanso
Der Ordneraufbau sieht folgendermaßen aus:
~/Library/Application Support/espanso% tree
.
├── config
│ └── default.yml
└── match
├── base.yml
└── packages
└── apple-symbols
├── _manifest.yml
├── _pkgsource.yml
├── LICENSE
├── package.yml
└── README.md
Im match
-Ordner finden sich die Ersetzungsregeln und Community Packages. Für eine übersichtliche Organisation können verschiedene YAML-Dateien für unterschiedliche Regelgruppen erstellt werden, z. B. email.yml
für E‑Mail-bezogene Regeln oder markdown.yml
für Regeln, die in Markdown-Editoren hilfreich sind.
Im config
-Ordner wird die Funktionsweise von Espanso selbst konfiguriert. Hier finden sich verschiedene Einstellungsparameter, die nach Bedarf aktiviert werden können. Beispielsweise kann die Tastenkombination für die Suche geändert werden:
#--- Search Shortcut
search_shortcut: ALT+CTRL+SPACE
Eine der leistungsstarken Funktionen von Espanso ist die Möglichkeit, spezifische Konfigurationsdateien für individuelle Anwendungen zu erstellen. Zum Herausfinden der benötigten Filter-Parameter für eine Anwendung genügt die Eingabe von #detect#
in einem Textfeld dieser Anwendung. Hier für Obsidian:
title: 'Espanso Artikel - ObsidianNotes - Obsidian v1.4.16'
exec: '/Applications/Obsidian.app'
class: 'md.obsidian'
Mit den erhaltenen Informationen kann dann eine angepasste Konfigurationsdatei erstellt werden, die nur in der spezifischen Anwendung aktiv ist. In dieser Datei können match
-Dateien für diese Anwendungen ausschließlich aktiviert oder ausgeschlossen werden. Oder Espanso kann für die Anwendung auch komplett ausgeschalten werden. So könnte eine obsidian.yml
im config
-Ordner, die Espanso in Obsidian ganz ausschaltet, aussehen:
filter_class: obsidian
enable: false
Dateien mit einem vorangestellten Unterstrich (z. B. _email.yml
) werden standardmäßig nicht geladen und können dann gezielt für spezifische Anwendungen aktiviert werden.
So können beispielsweise Regeln für Markdown und HTML in verschiedenen Dateien erstellt werden, die zwar die gleichen Trigger verwenden, diese jedoch je nach Anwendung unterschiedlich ersetzen. Das bietet den Vorteil, dass mit denselben Triggern beispielsweise für das Einfügen eines Links, je nach Anwendung, entweder die HTML- oder die Markdown-Syntax eingefügt werden kann.
filter_class: obsidian
enable: true
extra_includes:
- "../match/`_markdown.yml"
Darüber hinaus ist es auch möglich, das Laden von Packages in bestimmten Programmen zu verhindern. Es könnte beispielsweise ein emoji-Package in der Signal deaktiviert werden, wenn dieses mit den programmeigenen Definitionen in Konflikt gerät.
filter_exec: Signal
extra_excludes:
- "../match/packages/all-emojis/*"
Die Dokumentation bietet weitere Details und Anleitungen für spezifische Konfigurationsoptionen.
Ein paar Links
Obwohl dieser Artikel recht lang geworden ist, berühre ich nur einen kleinen Teil der Möglichkeiten. Daher möchte ich hier ein paar Links teilen, die ebenfalls gute Einführungen bieten:
- Getting Started | Espanso
- Dieses Video von Nicole van Hoeven hat mich dazu inspiriert, Espanso zu installieren: Text expansion in Obsidian with Espanso
- Victor Aguirre bietet eine leicht verständliche Einführung zu Espanso (shortcuts) — My Notes.
- Using Espanso to boost Efficiency von Alica’s Notes stellt einige interessante Anwendungsfälle für Espanso vor.
- Lissy93 teilt ihre Konfigurationen auf Github: espanso-config: 🦄 My configuration files for the Espanso text expander.
The End
Durch Espanso verbessert sich mein Schreibfluss. Nicht nur für oft wiederkehrende Textbausteine sind die Textergänzungen hilflreich. Gerade auch für so manche Markdown Syntax, die ich nicht so häufig nutze, habe brauche ich mir nur den Trigger zu merken und brauche dafür nicht das Schreiben abbrechen um in der Doku zu suchen. Ich bin im Moment selber erst am Anfang, denke aber, dass mein match
Ordner sich in der nächsten Zeit mit Regeldefinitionen füllen wird.
Danke für die Aufmerksamkeit und wie immer Anregungen, Kritik, Fehler, Lob bitte in die Kommentare.
Ergänzung: Ich erwähne, dass ich die Bedienung der Tastenersetzungen in der Alfred App als etwas kompliziert empfand und deshalb nach einer anderen Möglichkeit gesucht habe. Da ich eine Checkbox übersehen hatte, dachte ich bis heute, dass eine automatische Ergänzung beim Tippen nicht möglich wäre. Tatsächlich habe ich einfach eine Checkbox übersehen; es wäre mit der Alfred App auch möglich gewesen.
Schreibe einen Kommentar