autohotkey Alternative espanso auf macOS Monterey

Ich musste beruflich mal wieder umsteigen, nach 6 Jahren auf Windows bin ich jetzt wieder auf macOS unterwegs. Da es auf dem Mac autohotkey einfach nicht gibt und ich in den letzten 17 Jahren hunderte von shortcuts memorisiert habe, musste ein Ersatz her. Hier war reddit mal wieder mein Freund. In einem Sub wurde sich da mal über Alternativen unterhalten. Da konnte man ja einfach mal schauen welche am häufigsten auftauchte und das war espanso. Ein open source Projekt, was schon mal dafür spricht und außerdem werden YAML-Dateien verwendet. Die verwenden wir im Job auch und dann war der Umstieg nicht schwer. Was machst Du jetzt mit 800 Shortcuts im .ahk Format? VIM anwerfen, umformatieren mit einem Macro und nach ein paar Stunden fummelei, wegen des neuen YML-Syntax lief dann alles wieder. Und weil das so gut geklappt hat, habe ich direkt auf meiner Parallels Windows 11 arm64 Installation auch espanso installiert, da hier meine autohotkey nicht sauber funktionieren wollte.

#
#
#  ███████╗██╗███╗   ██╗███████╗███████╗██╗██╗     ███████╗██████╗
#  ██╔════╝██║████╗  ██║╚══███╔╝██╔════╝██║██║     ██╔════╝██╔══██╗
#  █████╗  ██║██╔██╗ ██║  ███╔╝ █████╗  ██║██║     █████╗  ██████╔╝
#  ██╔══╝  ██║██║╚██╗██║ ███╔╝  ██╔══╝  ██║██║     ██╔══╝  ██╔══██╗
#  ███████╗██║██║ ╚████║███████╗███████╗██║███████╗███████╗██║  ██║
#  ╚══════╝╚═╝╚═╝  ╚═══╝╚══════╝╚══════╝╚═╝╚══════╝╚═════╝╚═╝  ╚═╝
#
#   Hilfen:
#   vars: [{ name: "clipboard", type: "clipboard" }]
#   label: "" unterhalb von trigger
#   Multiple triggers - triggers: ["" , ""]
#   Enter = \n
#
matches:
 - trigger: "--#"
   replace: "-preisvergleich -yatego -amazon -ebay -preisroboter -idealo -ladenzeile -kaufen

Man sieht schon, alles kein Hexenwerk. Mit trigger: wird der Shortcut definiert, hier --# und replace: definiert die Ersetzung, hier also "-preisvergleich -yatego -amazon -ebay -preisroboter -idealo -ladenzeile -kaufen" das brauche ich dann schon mal in der Goolge Suche, wenn ich das Produkt nicht kaufen will.

Die Syntax ist wirklich schnell gelernt. Mit "vars: [{ name: "clipboard", type: "clipboard" }]" wird auf die Zwischenablage zugegriffen.

triggers: ["sgf#", "sf#" ]
replace: "Sehr geehrte Frau ,\n"
vars: [{ name: "clipboard", type: "clipboard" }]

Hier löst sgf# oder sf# sie Ersetzung "Sehr geehrte Frau Meier, ENTER" aus, wenn Meier in der Zwischenablage war. Man kann also mehrere Trigger für die selbe Ersetzung definieren.

Super praktisch sind auch die automatisch generierten Pop-Ups. In autohotkey hatte ich dafür ein Array das per zufallszahl eine EAN/GTIN ausgewählt hat. Das ist zwar viel praktischer als das folgende, aber soweit bin ich mit espanso leider noch nicht.

#
#
# ███████╗ █████╗ ███╗   ██╗    ██╗ ██████╗████████╗██╗███╗   ██╗
# ██╔════╝██╔══██╗████╗  ██║   ██╔╝██╔════╝╚══██╔══╝██║████╗  ██║
# █████╗  ███████║██╔██╗ ██║  ██╔╝ ██║  ███╗  ██║   ██║██╔██╗ ██║
# ██╔══╝  ██╔══██║██║╚██╗██║ ██╔╝  ██║   ██║  ██║   ██║██║╚██╗██║
# ███████╗██║  ██║██║ ╚████║██╔╝   ╚██████╔╝  ██║   ██║██║ ╚████║
# ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝╚═╝     ╚═════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝
#
#
# internaltest EAN/GTIN
  - trigger: "sdd"
    replace: "2000001811153"
  - trigger: "sdd"
    replace: "2000002615743"
  - trigger: "sdd"
    replace: "2000002615767"
  - trigger: "sdd"
    replace: "2000001811139"

Wenn ich sdd eintippe poppt gleich ein Fenster auf und ich kann per Pfeiltaste oder mit Alt+1, Alt+2 usw. einen Eintrag absenden.

espanso popup

Lintalist

Noch so ein Programm das auf autohotkey basiert und das ich intensiv auf der Windows Maschine benutzt habe. Auch hier konnte ich mit espanso bisher ganz gute Ergebnisse erzielen. Man braucht noch Keyboard Maestro, das leider kein Open Source Projekt ist, aber die Investition hat sich gelohnt.

Lintalist habe ich hauptsächlich verwendet um HTML Code inkl. Zwischenablage zu ersetzen, oder HTML-Tabellen zu erzeugen und gleich die Anzahl der Spalten mitzugeben. Auch das klappt gut mit espanso, wenn man einmal verstanden hat, wie man Sonderzeichen escapen muss.

Hier wird eine Kapitel-Navigation eingefügt:

label: "Kapitel Navigation unten Clickhelp"
replace: "<p></p><hr/><p><ch:nav type=\"previous\" text=\"vorheriges Kapitel\" class=\"CHNavLinkPrevious\"/> | <ch:nav type=\"top\"  text=\"Übergeordnetes Kapitel\" class=\"CHNavLinkTop\"/> | <ch:nav type=\"next\" text=\"nächstes Kapitel\" class=\"CHNavLinkNext\"/></p><p><br/></p><p></p>"

Sieht immer etwas wilder aus, als es am Ende dann ist. Man gewöhnt sich schnell dran.