Maccy + Hammerspoon: macOS पर अपने क्लिपबोर्ड वर्कफ़्लो को स्क्रिप्ट करें
Maccy + Hammerspoon: macOS पर अपने क्लिपबोर्ड वर्कफ़्लो को स्क्रिप्ट करें
Maccy में कोई स्क्रिप्टिंग API नहीं है, इसलिए इसे Hammerspoon के साथ जोड़ा जाता है। Maccy App आपकी क्लिपबोर्ड हिस्ट्री को स्टोर और सर्च करता है। Hammerspoon macOS के लिए एक मुफ़्त Lua ऑटोमेशन टूल है, जो क्लिपबोर्ड का कंटेंट बदल सकता है, क्लिपबोर्ड को छुए बिना टेक्स्ट टाइप कर सकता है और कस्टम हॉटकी से Maccy Mac को ट्रिगर कर सकता है। दोनों मिलकर किसी भारी टूल के बिना ज़्यादातर क्लिपबोर्ड ऑटोमेशन संभाल लेते हैं।
दोनों को साथ क्यों इस्तेमाल करें?
Maccy Clipboard जानबूझकर छोटा रखा गया है: मेन्यू-बार पॉपअप, तेज़ सर्च, पिन और एक ignore लिस्ट। मेरी जानकारी में इसमें कोई AppleScript डिक्शनरी, CLI या URL-स्कीम API नहीं है । लोकल-फ़र्स्ट और प्राइवेसी-केंद्रित टूल के लिए यह अच्छी बात है, लेकिन इसका मतलब है कि कोई भी शर्त वाला काम (“ट्रैकिंग पैरामीटर हटाओ, फिर पेस्ट करो”) कहीं और से करना पड़ेगा।
Hammerspoon इसके लिए ठीक बैठता है, क्योंकि यह ओपन सोर्स है, लोकल चलता है और macOS के pasteboard और कीबोर्ड API से सीधे बात करता है। दोनों को Homebrew से इंस्टॉल करें:
brew install --cask maccy hammerspoon
इसके बाद System Settings → Privacy & Security → Accessibility में Hammerspoon को अनुमति दें। इसके बिना कीस्ट्रोक वाली कोई भी रेसिपी काम नहीं करेगी। आपका कॉन्फ़िग ~/.hammerspoon/init.lua में रहता है। उसे Hammerspoon के मेन्यू-बार आइकन से या hs.reload() चलाकर रीलोड करें।
कौन सा टूल किस काम में बेहतर है?
| काम | सिर्फ़ Maccy | Hammerspoon चाहिए |
|---|---|---|
| हिस्ट्री आइटम सर्च, पिन और पेस्ट करना | हाँ | नहीं |
| Maccy की पॉपअप हॉटकी बदलना | हाँ (Settings → General) | नहीं |
| कुछ ऐप्स या कंटेंट टाइप को स्किप करना | हाँ (Settings → Ignore) | नहीं |
| पेस्ट से पहले क्लिपबोर्ड टेक्स्ट बदलना | नहीं | हाँ |
| क्लिपबोर्ड इस्तेमाल किए बिना स्निपेट टाइप करना | नहीं | हाँ |
| एक टाइमआउट के बाद क्लिपबोर्ड अपने-आप साफ़ करना | नहीं | हाँ |
| स्क्रिप्ट से हिस्ट्री की कोई एक एंट्री डिलीट करना | नहीं | भरोसेमंद ढंग से नहीं |
मोटा नियम: अगर Maccy में उस काम की सेटिंग मौजूद है, तो सेटिंग ही इस्तेमाल करें। Lua तभी उठाएँ जब लॉजिक ऐसा हो जो Maccy व्यक्त न कर सके।
रेसिपी 1: कस्टम हॉटकी से Maccy कैसे खोलें?
सिर्फ़ शॉर्टकट बदलना हो तो Hammerspoon की ज़रूरत नहीं है। Maccy → Settings → General में पॉपअप शॉर्टकट सेट कर लें। Hammerspoon तभी काम का है जब ट्रिगर किसी शर्त पर निर्भर हो, जैसे हर ऐप के लिए अलग शॉर्टकट। Maccy का डिफ़ॉल्ट ⇧⌘C है —, और Hammerspoon उसे फ़ायर कर सकता है:
local hyper = {"ctrl", "alt", "cmd"}
hs.hotkey.bind(hyper, "v", function()
hs.eventtap.keyStroke({"shift", "cmd"}, "c")
end)
इसे अपनी मशीन पर टेस्ट करें: सिंथेटिक की-इवेंट हर ऐप की ग्लोबल हॉटकी को ट्रिगर नहीं करते । साथ ही दोनों टूल में एक ही कॉम्बिनेशन कभी बाइंड न करें, क्योंकि जो पहले रजिस्टर होगा वही चलेगा और दूसरा चुपचाप कुछ नहीं करेगा।
रेसिपी 2: URL पेस्ट करने से पहले ट्रैकिंग पैरामीटर कैसे हटाएँ?
यह सबसे क्लासिक उपयोग है। utm_* से भरा लिंक कॉपी करें, हॉटकी दबाएँ और साफ़ वर्शन पेस्ट करें।
local function stripTracking(url)
for _ = 1, 3 do -- repeat: adjacent params overlap in a single pass
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("Clipboard isn't a single URL")
return
end
hs.pasteboard.setContents(stripTracking(clip))
hs.timer.doAfter(0.05, function()
hs.eventtap.keyStroke({"cmd"}, "v")
end)
end)
50 ms की देरी ज़रूरी है। pasteboard पर लिखते ही उसी पल पेस्ट करने से पुराना कंटेंट पेस्ट हो सकता है। ध्यान रखें कि साफ़ किया हुआ URL Maccy में मूल URL के बगल में एक नई एंट्री के रूप में दिखेगा। अगर यह खटकता है तो रेसिपी 5 देखें।
रेसिपी 3: क्लिपबोर्ड हिस्ट्री गंदी किए बिना स्निपेट कैसे पेस्ट करें?
क्लिपबोर्ड का इस्तेमाल ही मत कीजिए। hs.eventtap.keyStrokes अक्षरों को ऐसे टाइप करता है जैसे आपने खुद दबाए हों, इसलिए Maccy को इनकी भनक तक नहीं लगती:
hs.hotkey.bind({"ctrl", "alt", "cmd"}, "e", function()
hs.eventtap.keyStrokes("you@example.com")
end)
असली इस्तेमाल से मिली सीमाएँ: लंबी स्ट्रिंग के लिए टाइपिंग पेस्ट से धीमी है, non-ASCII अक्षर और कुछ इनपुट मेथड गड़बड़ कर सकते हैं —, और पासवर्ड बॉक्स जैसे secure input फ़ील्ड में यह कुछ नहीं करता, क्योंकि वहाँ macOS सिंथेटिक कीस्ट्रोक ब्लॉक कर देता है।
रेसिपी 4: क्लिपबोर्ड पर मौजूद JSON को pretty-print कैसे करें?
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 prettified")
else
hs.alert.show("Clipboard isn't valid JSON")
end
end)
एक ईमानदार सीमा: Lua टेबल unordered होती हैं, इसलिए की (keys) उस क्रम में वापस नहीं आतीं जिसमें आपने कॉपी की थीं। जहाँ क्रम मायने रखता हो, वहाँ hs.task से jq को शेल-आउट करें।
रेसिपी 5: Hammerspoon की लिखावट से Maccy को भरने से कैसे रोकें?
कई क्लिपबोर्ड टूल “transient” pasteboard टाइप को मानते हैं। यह एक कन्वेंशन है, जो मैनेजर्स को बताती है कि इस आइटम को स्किप करना है। Maccy में ignored टाइप्स की एक डिफ़ॉल्ट लिस्ट आती है, और आप उसे Settings → Ignore में बढ़ा सकते हैं —। वहाँ org.nspasteboard.TransientType जोड़ें, फिर अपनी लिखावट को टैग करें:
hs.pasteboard.setContents(cleaned)
hs.pasteboard.writeDataForUTI(nil, "org.nspasteboard.TransientType", "", true) --
इसे एक प्रयोग मानें। भरोसा करने से पहले Maccy में जाँच लें कि आइटम सचमुच स्किप हो रहा है।
रेसिपी 6: क्या क्लिपबोर्ड से सीक्रेट अपने-आप साफ़ किए जा सकते हैं?
आंशिक रूप से। एक pasteboard watcher API-key जैसी दिखने वाली स्ट्रिंग पहचान सकता है और 30 सेकंड बाद क्लिपबोर्ड साफ़ कर सकता है:
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) -- keep this global, or it gets garbage-collected
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()
सबसे अहम बात इसकी सीमा है: आपका watcher फ़ायर होने तक Maccy सीक्रेट को पहले ही स्टोर कर चुका होता है। सिस्टम क्लिपबोर्ड साफ़ करने से Maccy की हिस्ट्री पर कोई असर नहीं पड़ता। सीक्रेट्स के लिए Maccy की Ignore सेटिंग्स में एक ignore रूल जोड़ें, चाहे सोर्स ऐप (आपका पासवर्ड मैनेजर) के आधार पर या किसी पैटर्न के आधार पर, ताकि वे कभी स्टोर ही न हों। Hammerspoon को सिर्फ़ दूसरी सुरक्षा परत की तरह इस्तेमाल करें। अपने Hammerspoon वर्शन पर watcher callback का आर्गुमेंट जाँच लें ।
आमतौर पर क्या गड़बड़ होती है?
| लक्षण | संभावित कारण | समाधान |
|---|---|---|
| हॉटकी कुछ नहीं करतीं | Accessibility अनुमति नहीं है | Privacy & Security में Hammerspoon दोबारा चालू करें और उसे रीस्टार्ट करें |
| पुराना क्लिपबोर्ड कंटेंट पेस्ट हो रहा है | लिखने और ⌘V के बीच कोई देरी नहीं | पेस्ट को hs.timer.doAfter(0.05, …) में रैप करें |
| कुछ समय बाद watcher फ़ायर होना बंद कर देता है | Watcher ऑब्जेक्ट garbage-collect हो गया | उसे ग्लोबल वेरिएबल में रखें |
| शॉर्टकट सिर्फ़ एक ऐप में चलता है | उस ऐप की अपनी बाइंडिंग से टकराव | hyper-key कॉम्बो चुनें (⌃⌥⌘ + कोई अक्षर) |
| किसी फ़ील्ड में कुछ टाइप नहीं होता | Secure input चालू है | यह अपेक्षित है; macOS इसे डिज़ाइन से ही ब्लॉक करता है |
Pasteboard watching पर प्राइवेसी नोट
हाल के macOS रिलीज़ उपयोगकर्ताओं को यह बताने की दिशा में बढ़ रहे हैं कि कौन सा ऐप pasteboard पढ़ रहा है —। Watcher स्क्रिप्ट आपकी कॉपी की हर चीज़ पढ़ती है, इसलिए अपना Lua कोड लोकल रखें, क्लिपबोर्ड का कंटेंट कभी डिस्क पर लॉग न करें, और इंटरनेट से कॉपी किया कोई भी कॉन्फ़िग चलाने से पहले उसे ध्यान से पढ़ लें।
आगे कहाँ जाएँ?
रेसिपी 2 से शुरू करें। यह छोटी है, तुरंत काम आती है और write-then-paste पैटर्न सिखाती है, जिस पर बाकी रेसिपी टिकी हैं। फिर तय करें कि किन कामों को हॉटकी मिलनी चाहिए। अगर आप अपने दिन से एक दोहराया जाने वाला क्लिपबोर्ड काम हटा सकें, तो वह कौन सा होगा?
Maccy मुफ़्त और ओपन सोर्स है; इसे maccy.app से डाउनलोड करें।