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.

Similar Posts