Maccy + Hammerspoon: Deinen Clipboard-Workflow unter macOS skripten
Maccy + Hammerspoon: Deinen Clipboard-Workflow unter macOS skripten
Maccy hat keine Skript-API, deshalb kombinierst du es mit Hammerspoon. Maccy App speichert und durchsucht deinen Zwischenablage-Verlauf. Hammerspoon, ein kostenloses Lua-Automatisierungstool für macOS, schreibt Inhalte der Zwischenablage um, tippt Text ein, ohne die Zwischenablage anzufassen, und löst Maccy Mac über eigene Tastenkürzel aus. Zusammen decken die beiden die meisten Clipboard-Automatisierungen ab, ohne dass du ein schwergewichtigeres Tool brauchst.
Warum überhaupt kombinieren?
Maccy Clipboard ist bewusst schlank gehalten: ein Popup in der Menüleiste, schnelle Suche, angeheftete Einträge und eine Ignorieren-Liste. Soweit ich weiß, bietet es kein AppleScript-Dictionary, kein CLI und keine URL-Scheme-API . Für ein Local-first-Tool mit Fokus auf Datenschutz ist das eine bewusste Entscheidung – es bedeutet aber, dass alles Bedingte („Tracking-Parameter entfernen, dann einfügen“) woanders passieren muss.
Hammerspoon passt gut dazu: Es ist Open Source, läuft lokal und spricht direkt mit den macOS-APIs für Pasteboard und Tastatur. Beide Tools installierst du per Homebrew:
brew install --cask maccy hammerspoon
Anschließend gibst du Hammerspoon unter Systemeinstellungen → Datenschutz & Sicherheit → Bedienungshilfen Zugriff. Ohne diese Berechtigung funktioniert keines der Tastenanschlag-Rezepte. Deine Konfiguration liegt in ~/.hammerspoon/init.lua; du lädst sie über das Menüleistensymbol von Hammerspoon oder mit hs.reload() neu.
Was kann welches Tool am besten?
| Aufgabe | Maccy allein | Braucht Hammerspoon |
|---|---|---|
| Verlaufseinträge suchen, anheften und einfügen | Ja | Nein |
| Tastenkürzel für Maccys Popup ändern | Ja (Einstellungen → Allgemein) | Nein |
| Bestimmte Apps oder Inhaltstypen überspringen | Ja (Einstellungen → Ignorieren) | Nein |
| Text der Zwischenablage vor dem Einfügen umschreiben | Nein | Ja |
| Textbaustein tippen, ohne die Zwischenablage zu nutzen | Nein | Ja |
| Zwischenablage nach einem Timeout automatisch leeren | Nein | Ja |
| Einen bestimmten Verlaufseintrag per Skript löschen | Nein | Nicht zuverlässig |
Faustregel: Wenn Maccy dafür eine Einstellung hat, nutze die Einstellung. Greif nur dann zu Lua, wenn es um Logik geht, die Maccy nicht abbilden kann.
Rezept 1: Wie öffne ich Maccy über ein eigenes Tastenkürzel?
Für eine einfache Neubelegung brauchst du Hammerspoon nicht. Lege das Kürzel für das Popup unter Maccy → Einstellungen → Allgemein fest. Hammerspoon lohnt sich erst, wenn der Auslöser an Bedingungen geknüpft ist, etwa ein anderes Kürzel pro App. Maccys Standardkürzel ist ⇧⌘C , und Hammerspoon kann es auslösen:
local hyper = {"ctrl", "alt", "cmd"}
hs.hotkey.bind(hyper, "v", function()
hs.eventtap.keyStroke({"shift", "cmd"}, "c")
end)
Teste das auf deinem Rechner: Synthetische Tastenereignisse lösen nicht in jeder App die globalen Hotkeys aus . Belege außerdem nie dieselbe Kombination in beiden Tools – wer sich zuerst registriert, gewinnt, und das andere Tool tut stillschweigend nichts.
Rezept 2: Wie entferne ich Tracking-Parameter, bevor ich eine URL einfüge?
Das ist der Klassiker. Du kopierst einen Link voller utm_*-Ballast, drückst ein Tastenkürzel und fügst die saubere Version ein.
local function stripTracking(url)
for _ = 1, 3 do -- wiederholen: benachbarte Parameter überlappen sich in einem einzelnen Durchlauf
url = url:gsub("([?&])utm_[%w_]+=[^&#]*&?", "%1")
url = url:gsub("([?&])fbclid=[^&#]*&?", "%1")
end
url = url:gsub("[?&]$", "")
return url
end
hs.hotkey.bind({"ctrl", "alt", "cmd"}, "u", function()
local clip = hs.pasteboard.getContents()
if not clip or not clip:match("^https?://%S+$") then
hs.alert.show("Zwischenablage ist keine einzelne URL")
return
end
hs.pasteboard.setContents(stripTracking(clip))
hs.timer.doAfter(0.05, function()
hs.eventtap.keyStroke({"cmd"}, "v")
end)
end)
Die Verzögerung von 50 ms ist wichtig. Fügst du im selben Moment ein, in dem du ins Pasteboard schreibst, kann noch der alte Inhalt eingefügt werden. Rechne damit, dass die bereinigte URL als neuer Eintrag neben dem Original in Maccy auftaucht. Falls dich das stört, hilft Rezept 5.
Rezept 3: Wie füge ich einen Textbaustein ein, ohne den Zwischenablage-Verlauf zu verschmutzen?
Nutze die Zwischenablage einfach gar nicht. hs.eventtap.keyStrokes tippt Zeichen, als würdest du sie auf der Tastatur eingeben – Maccy bekommt davon nichts mit:
hs.hotkey.bind({"ctrl", "alt", "cmd"}, "e", function()
hs.eventtap.keyStrokes("du@example.com")
end)
Einschränkungen aus der Praxis: Bei langen Strings ist Tippen langsamer als Einfügen, Nicht-ASCII-Zeichen und manche Eingabemethoden können sich seltsam verhalten , und in sicheren Eingabefeldern wie Passwortfeldern funktioniert es nicht, weil macOS dort synthetische Tastenanschläge blockiert.
Rezept 4: Wie formatiere ich JSON in der Zwischenablage lesbar?
hs.hotkey.bind({"ctrl", "alt", "cmd"}, "j", function()
local ok, data = pcall(hs.json.decode, hs.pasteboard.getContents() or "")
if ok and data then
hs.pasteboard.setContents(hs.json.encode(data, true))
hs.alert.show("JSON formatiert")
else
hs.alert.show("Zwischenablage ist kein gültiges JSON")
end
end)
Eine ehrliche Einschränkung: Lua-Tabellen sind ungeordnet, die Schlüssel kommen also in anderer Reihenfolge zurück, als du sie kopiert hast. Wenn es auf die Reihenfolge ankommt, rufst du stattdessen mit hs.task jq auf.
Rezept 5: Wie verhindere ich, dass Hammerspoons Schreibvorgänge Maccy zumüllen?
Viele Clipboard-Tools respektieren „transiente“ Pasteboard-Typen – eine Konvention, die Managern signalisiert, einen Eintrag zu überspringen. Maccy bringt eine Standardliste ignorierter Typen mit, die du unter Einstellungen → Ignorieren erweitern kannst . Trage dort org.nspasteboard.TransientType ein und markiere dann deine eigenen Schreibvorgänge entsprechend:
hs.pasteboard.setContents(cleaned)
hs.pasteboard.writeDataForUTI(nil, "org.nspasteboard.TransientType", "", true) --
Betrachte das als Experiment. Prüfe in Maccy, dass der Eintrag tatsächlich übersprungen wird, bevor du dich darauf verlässt.
Rezept 6: Kann ich Geheimnisse automatisch aus der Zwischenablage löschen?
Teilweise. Ein Pasteboard-Watcher kann Strings erkennen, die wie API-Schlüssel aussehen, und die Zwischenablage nach 30 Sekunden leeren:
local function looksSecret(s)
if #s < 20 or s:find("%s") then return false end
return s:match("^sk%-[%w_%-]+$") or s:match("^AKIA[%u%d]+$") or s:match("^ghp_%w+$")
end
local clearTimer
clipWatcher = hs.pasteboard.watcher.new(function(content) -- global halten, sonst wird er vom Garbage Collector entfernt
if type(content) == "string" and looksSecret(content) then
if clearTimer then clearTimer:stop() end
local count = hs.pasteboard.changeCount()
clearTimer = hs.timer.doAfter(30, function()
if hs.pasteboard.changeCount() == count then
hs.pasteboard.clearContents()
end
end)
end
end)
clipWatcher:start()
Die Grenze ist das Entscheidende: Maccy hat das Geheimnis schon gespeichert, wenn dein Watcher anschlägt. Das Leeren der System-Zwischenablage berührt Maccys Verlauf nicht. Für Geheimnisse legst du deshalb in Maccys Ignorieren-Einstellungen eine Regel an – entweder nach Quell-App (dein Passwortmanager) oder nach Muster –, damit sie gar nicht erst gespeichert werden. Nutze Hammerspoon nur als zweite Schutzschicht. Prüfe das Argument des Watcher-Callbacks in deiner Hammerspoon-Version .
Was geht typischerweise schief?
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| Hotkeys tun nichts | Berechtigung für Bedienungshilfen fehlt | Hammerspoon unter Datenschutz & Sicherheit erneut aktivieren und neu starten |
| Alter Inhalt der Zwischenablage wird eingefügt | Keine Verzögerung zwischen Schreiben und ⌘V | Das Einfügen in hs.timer.doAfter(0.05, …) verpacken |
| Watcher feuert nach einer Weile nicht mehr | Watcher-Objekt wurde vom Garbage Collector entfernt | In einer globalen Variable speichern |
| Kürzel funktioniert nur in einer App | Konflikt mit dem eigenen Kürzel dieser App | Hyper-Key-Kombination wählen (⌃⌥⌘ + Buchstabe) |
| In ein Feld wird nichts getippt | Sichere Eingabe ist aktiv | Erwartetes Verhalten; macOS blockiert das absichtlich |
Hinweis zum Datenschutz beim Überwachen des Pasteboards
Neuere macOS-Versionen gehen dazu über, Nutzer zu informieren, wenn Apps das Pasteboard auslesen . Ein Watcher-Skript liest alles mit, was du kopierst. Halte dein Lua deshalb lokal, protokolliere Inhalte der Zwischenablage nie auf der Festplatte und prüfe jede Konfiguration, die du aus dem Internet übernimmst, bevor du sie ausführst.
Wie geht es weiter?
Fang mit Rezept 2 an. Es ist kurz, sofort nützlich und zeigt dir das Muster „schreiben, dann einfügen“, auf dem die anderen aufbauen. Danach entscheidest du, was ein eigenes Tastenkürzel verdient. Wenn du eine wiederkehrende Clipboard-Routine aus deinem Alltag streichen könntest: Welche wäre es?
Maccy ist kostenlos und Open Source; du findest es auf maccy.app.