呆貓桌面云 for Mac V1.20.3 蘋果電腦版203MB / 12-29
OnTime PRO for Mac(桌面時(shí)鐘工具) v3.2 直裝激活版72.1MB / 07-17
天翼云電腦 for Mac v2.6.2 蘋果電腦版112MB / 06-27
Digital Clock 3D for Mac(3D數(shù)字時(shí)鐘動(dòng)態(tài)桌面) v2.1.1 免費(fèi)激活64.2MB / 08-02
Firework for Mac(Web應(yīng)用轉(zhuǎn)桌面程序) V3.0.37.8 蘋果電腦版126MB / 03-25
Desktop Curtain(桌面圖標(biāo)快速隱藏軟件) for Mac v3.1 一鍵安裝9.29MB / 03-08
將任何網(wǎng)站轉(zhuǎn)換為桌面Mac應(yīng)用程序 Coherence X v4.4.0 直裝特別12.63MB / 04-20
Pap.er (mac桌面壁紙軟件) for Mac V3.5.1 蘋果電腦版2.27MB / 06-05
Quick Desktop(一鍵最小化窗口)for Mac V1.0.2 蘋果電腦版102MB / 02-17
Digital Clock (桌面數(shù)字時(shí)鐘) for Mac V4.7.8 蘋果電腦版22.7MB / 05-26
-
Cherry Studio AI桌面客戶端 v1.9.6 Mac官方中文版(Intel/Apple 其他軟件 / 361MB
-
-
Koodo Reader for mac(電子書閱讀器) v2.3.4 蘋果電腦Apple版 其他軟件 / 124 MB
-
小滴云手機(jī)for mac(非常實(shí)用的云手機(jī)) v1.0.1.2 蘋果電腦版 其他軟件 / 9.36 MB
-
-
LinkAndroid(安卓電腦互聯(lián)助手) v1.0.1 inter/Apple芯片 Mac官方 其他軟件 / 319MB
-
Telestream Wirecast Pro for Mac v16.5.1 蘋果電腦免費(fèi)版 其他軟件 / 819MB
-
-
-
詳情介紹
hammerspoon mac版是一款簡單而強(qiáng)大的macOS自動(dòng)化工具,它為您提供了一個(gè)合適的環(huán)境,用于編寫Lua代碼腳本,用于設(shè)置可以使用全局熱鍵組合觸發(fā)的自動(dòng)操作。簡而言之,Hammerspoon將系統(tǒng)API橋接到一個(gè)簡單的Lua腳本引擎,這意味著它使您能夠編寫Lua腳本以自動(dòng)執(zhí)行各種自動(dòng)化任務(wù)。

Hammerspoon Mac版安裝教程
hammerspoon mac版安裝包下載完成后打開,將【Hammerspoon】拖到應(yīng)用程序。

Hammerspoon Mac最新版軟件介紹
Hammerspoon是OS X的桌面自動(dòng)化工具。它將各種系統(tǒng)級(jí)API連接到Lua腳本引擎,通過編寫Lua腳本,您可以對系統(tǒng)產(chǎn)生強(qiáng)大的影響。
這很簡單的描述。您可以編寫與應(yīng)用程序,Windows,鼠標(biāo)指針,文件系統(tǒng)對象,音頻設(shè)備,電池,屏幕,低級(jí)鍵盤/鼠標(biāo)事件,剪貼板,定位服務(wù),WiFi等等的OS X API進(jìn)行交互的Lua代碼。通常,您將在Lua中編寫一個(gè)將事件連接到操作的配置文件。您可能希望將鍵盤快捷鍵綁定到一系列窗口操作或applescript。當(dāng)您的WiFi接口連接到家庭網(wǎng)絡(luò)時(shí),您可能需要運(yùn)行一系列命令。當(dāng)您的電池電量低于一定百分比時(shí),您可能希望顯示警報(bào)。你可能想做一些瘋狂的事情,就像iTunes在Mac偵測到你在巴黎時(shí)自動(dòng)開始播放的那樣。

Hammerspoon for Mac功能介紹
你好,世界
所有優(yōu)秀的編程教程都以某種類型的Hello World示例開頭,因此我們將使用Hammerspoon綁定鍵盤熱鍵來演示通過簡單通知說出Hello World。
在您的init.lua位置以下:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.alert.show("Hello World!")
end)
然后保存文件,單擊Hammerspoon菜單欄圖標(biāo)并選擇Reload Config。您現(xiàn)在應(yīng)該發(fā)現(xiàn)按?+ ?+ ctrl+ W將在屏幕上顯示Hello World通知。
這里發(fā)生的是我們告訴Hammerspoon將匿名函數(shù)綁定到特定的熱鍵。熱鍵是通過修飾鍵的表(指定?,?并且ctrl在這種情況下)和正常鍵(W)。匿名函數(shù)只是一個(gè)沒有名稱的函數(shù)。我們可以使用名稱單獨(dú)定義警報(bào)功能并將該名稱傳遞給hs.hotkey.bind(),但是Lua可以很容易地定義內(nèi)聯(lián)函數(shù)。
發(fā)燒友你好世界
雖然hs.alert很有用,但您可能更喜歡使用OS X本機(jī)通知,只需將上一個(gè)示例修改為:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.notify.new({title="Hammerspoon", informativeText="Hello World"}):send()
end)
窗戶運(yùn)動(dòng)簡介
使用Hammerspoon可以做的最直接有用的事情之一是操縱屏幕上的窗口。我們將從一個(gè)簡單的例子開始,并構(gòu)建一個(gè)更復(fù)雜的東西。
將以下內(nèi)容添加到您的init.lua:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "H", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x - 10
win:setFrame(f)
end)
這將導(dǎo)致?+ ?+ ctrl+ H使當(dāng)前聚焦的窗口向左移動(dòng)10個(gè)像素。您可以看到我們獲取當(dāng)前聚焦的窗口然后獲取其幀。這描述了窗口的位置和大小。然后我們可以修改框架并使用它將其應(yīng)用回窗口setFrame()。
快速結(jié)束冒號(hào)語法
您可能已經(jīng)注意到,有時(shí)我們在函數(shù)調(diào)用中使用點(diǎn),有時(shí)我們使用冒號(hào)。冒號(hào)語法意味著您正在調(diào)用該對象的方法之一。它仍然是一個(gè)函數(shù)調(diào)用,但它隱式地將對象作為self參數(shù)傳遞給方法。
快速關(guān)注可變生命周期
Lua使用垃圾收集來清理其內(nèi)存使用情況 - 它認(rèn)為不再使用的任何對象將在未來的某個(gè)時(shí)刻被銷毀(確切地說,何時(shí),可能非常不可預(yù)測,但它基于您的Lua代碼的活躍程度) 。
這意味著一旦函數(shù)/循環(huán)執(zhí)行完畢,只存在于函數(shù)/ loop / etc中的變量將可用于垃圾收集。這包括您的init.lua,它被認(rèn)為是在最后一行代碼運(yùn)行時(shí)完成的單個(gè)范圍。
如果您在自己中創(chuàng)建任何對象init.lua,則必須在變量中捕獲它們,否則將來會(huì)在某些時(shí)候以靜默方式銷毀它們。例如:
hs.pathwatcher.new(.....):start()
此處返回的對象(一個(gè)hs.pathwatcher對象)未被捕獲,因此只要init.lua完成,它就可用于垃圾收集。它可能不會(huì)在幾分鐘/幾小時(shí)后被銷毀,但是你會(huì)感到困惑,為什么你的pathwatcher沒有運(yùn)行。相反,這個(gè)版本將繼續(xù)存在,直到您重新加載配置,或退出Hammerspoon:
myWatcher = hs.pathwatcher.new(.....):start()
該myWatcher變量是一個(gè)全局變量,所以永遠(yuǎn)不會(huì)走出去的范圍。
關(guān)于變量的生命周期 - 在Console窗口中,每次鍵入一行并按Enter鍵時(shí),都會(huì)創(chuàng)建,執(zhí)行和完成不同的Lua范圍。這意味著local當(dāng)您按Enter鍵時(shí),在控制臺(tái)窗口中創(chuàng)建的變量將立即變得不可訪問,因?yàn)樗鼈兊姆秶殃P(guān)閉。
更復(fù)雜的窗口移動(dòng)
我們可以在簡單的窗口移動(dòng)示例的基礎(chǔ)上構(gòu)建一組鍵盤快捷鍵,允許我們使用nethack移動(dòng)鍵在所有方向上移動(dòng)窗口:
y k u
h l
b j n
要做到這一點(diǎn),我們只需要hs.hotkey.bind()稍微不同的幀修改重復(fù)前一個(gè)調(diào)用:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Y", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x - 10
f.y = f.y - 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "K", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.y = f.y - 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "U", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x + 10
f.y = f.y - 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "H", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x - 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "L", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x + 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "B", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x - 10
f.y = f.y + 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "J", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.y = f.y + 10
win:setFrame(f)
end)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "N", function()
local win = hs.window.focusedWindow()
local f = win:frame()
f.x = f.x + 10
f.y = f.y + 10
win:setFrame(f)
end)
試試看!
窗口大小
在本節(jié)中,我們將實(shí)現(xiàn)移動(dòng)窗口的常見窗口管理功能,使其占據(jù)屏幕的左半部分或右半部分,允許您為Productivity™平鋪兩個(gè)彼此相鄰的窗口。
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Left", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
這里我們將?+ ?+ ctrl+ ←(如左光標(biāo)鍵)綁定到將獲取聚焦窗口的函數(shù),然后獲取聚焦窗口所在的屏幕,獲取屏幕的框架(注意hs.screen.frame()不包括菜單欄)和停靠,看看hs.screen.fullFrame()你是否需要)并設(shè)置窗口的框架占據(jù)屏幕的左半部分。
為了解決這個(gè)問題,我們將添加一個(gè)函數(shù)將窗口移動(dòng)到屏幕的右半部分:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Right", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x + (max.w / 2)
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
這里一個(gè)很好的練習(xí)是看你現(xiàn)在是否可以為自己編寫功能,將上/下光標(biāo)鍵綁定到分別調(diào)整窗口的上半部/下半部分。
多窗口布局
當(dāng)您想要保持多個(gè)應(yīng)用程序一直打開,并以特定方式安排其窗口時(shí),您可以使用hs.layout擴(kuò)展名:
local laptopScreen = "Color LCD"
local windowLayout = {
{"Safari", nil, laptopScreen, hs.layout.left50, nil, nil},
{"Mail", nil, laptopScreen, hs.layout.right50, nil, nil},
{"iTunes", "iTunes", laptopScreen, hs.layout.maximized, nil, nil},
{"iTunes", "MiniPlayer", laptopScreen, nil, nil, hs.geometry.rect(0, -48, 400, 48)},
}
hs.layout.apply(windowLayout)
為了解決這個(gè)問題,我們首先在Mac上創(chuàng)建一個(gè)帶有主屏幕名稱的變量。您可以:name()在hs.screen對象上使用該方法找到這些名稱(例如hs.screen.allScreens()[1]:name(),在Hammerspoon控制臺(tái)中鍵入)。
然后,我們創(chuàng)建一個(gè)描述所需布局的表。表中的每個(gè)條目windowLayout都是另一個(gè)表,它選擇我們感興趣的窗口,并指定它們所需的位置和大小。
表格中的第一項(xiàng)是我們希望影響的應(yīng)用程序的名稱,第二項(xiàng)是我們希望影響的窗口的標(biāo)題。這些項(xiàng)目中的任何一項(xiàng)都可以nil,但不能兩者兼而有之。如果應(yīng)用程序名稱是,nil那么我們將匹配所有應(yīng)用程序中的給定窗口標(biāo)題。如果窗口標(biāo)題項(xiàng)是,nil那么我們將匹配給定應(yīng)用程序的所有窗口。
第四,第五和第六項(xiàng)用于以不同方式描述匹配窗口的布局。只有這些項(xiàng)目中的一個(gè)可具有一個(gè)值,并且該值應(yīng)為包含四個(gè)項(xiàng)目,一個(gè)表x,y,w和h(水平位置,垂直位置,寬度和高度,分別地)。
第四項(xiàng)是將給予的矩形hs.window:moveToUnit()。的x,y,w,和h該矩形的值,是值之間0.0并且1.0,允許你位置的窗口作為顯示器的級(jí)分,而不必關(guān)心顯示器的精確分辨率(例如hs.layout.left50是一個(gè)預(yù)先定義的矩形{x=0, y=0, w=0.5, h=1})。
第五項(xiàng)是一個(gè)矩形,它將被賦予hs.window:setFrame()并應(yīng)該將位置/大小值指定為屏幕上的像素位置,但不考慮OS菜單欄和底座。
第六個(gè)項(xiàng)目類似于第五個(gè)項(xiàng)目,但它確實(shí)考慮了操作系統(tǒng)菜單欄和???。這在上面的示例中顯示,它將iTunes Mini Player窗口置于屏幕的最左下方,即使底座在那里也是如此。請注意,我們使用hs.geometry.rect()輔助函數(shù)來構(gòu)造rect表,并且y值為負(fù),這意味著窗口的頂部應(yīng)該在顯示屏底部上方48像素處開始。
這可能看起來是一組相當(dāng)復(fù)雜的選項(xiàng),但是值得花一些時(shí)間學(xué)習(xí),因?yàn)樗试S非常強(qiáng)大的窗口布局,特別是對系統(tǒng)事件的反應(yīng)(例如插入監(jiān)視器時(shí)屏幕數(shù)量的變化,或者甚至只需按一個(gè)特定的熱鍵即可恢復(fù)窗戶的健康狀況。
窗口過濾器
在某些上下文或應(yīng)用程序中綁定熱鍵而不是其他熱鍵不是很有用嗎?組織窗口并根據(jù)位置,大小,工作流程或其任何組合對事件做出反應(yīng)?極其通用的hs.window.filter模塊允許您使用過濾規(guī)則和事件監(jiān)視器創(chuàng)建復(fù)雜的窗口分組和行為。展示該模塊功能的最佳方式是通過示例。
將內(nèi)容從Safari復(fù)制并粘貼到Messages.app時(shí),所有鏈接都在不斷擴(kuò)展,使文本難以閱讀:
Thrushes make up the Turdidae, a family of passerine birds that occurs worldwide.
只有Safari / Messages對受此影響,而其他OS X應(yīng)用程序通常會(huì)毫發(fā)意外地復(fù)制和粘貼。在窗口過濾器的幫助下,這種煩惱得到了徹底的糾正:
local function cleanPasteboard()
local pb = hs.pasteboard.contentTypes()
local contains = hs.fnutils.contains
if contains(pb, "com.apple.webarchive") and contains(pb, "public.rtf") then
hs.pasteboard.setContents(hs.pasteboard.getContents())
end
end
local messagesWindowFilter = hs.window.filter.new(false):setAppFilter('Messages')
messagesWindowFilter:subscribe(hs.window.filter.windowFocused, cleanPasteboard)
cleanPasteboard在檢查粘貼板內(nèi)容元數(shù)據(jù)類型后,該函數(shù)用純文本替換粘貼板上的Safari“富文本”。這確保了從Safari復(fù)制和粘貼圖像仍然有效。false默認(rèn)情況下,通過初始化來創(chuàng)建空窗口過濾器以排除所有窗口。添加了消息'appfilter',以便此窗口過濾器僅觀察消息窗口。然后我們訂閱windowfilter,以便cleanPasteboard每次Message窗口獲得焦點(diǎn)時(shí)都會(huì)調(diào)用它。當(dāng)某些窗口或應(yīng)用程序具有焦點(diǎn)時(shí),您可以類似地啟用/禁用自定義熱鍵。
Windowfilters是動(dòng)態(tài)的,根據(jù)約束集在后臺(tái)自動(dòng)過濾。通過使用謂詞函數(shù)初始化windowfilter,您可以創(chuàng)建任意復(fù)雜的過濾規(guī)則:
local wf = hs.window.filter.new(function(win)
local fw = hs.window.focusedWindow()
return (
win:isStandard() and
win:application() == fw:application() and
win:screen() == fw:screen()
)
end)
此窗口過濾器包含所有標(biāo)準(zhǔn)(非隱藏,非模態(tài))窗口,這些窗口共享當(dāng)前聚焦窗口的應(yīng)用程序和屏幕。窗口過濾器不斷更新,以便當(dāng)前聚焦的窗口確定正在播放的窗口組。這可用于使用hs.window.switcher或您自己的自定義循環(huán)器在當(dāng)前屏幕上循環(huán)使用聚焦的應(yīng)用程序窗口。
簡單的配置重新加載
您可能已經(jīng)注意到,在編輯配置時(shí),Reload Config每次進(jìn)行更改時(shí)都必須繼續(xù)選擇菜單項(xiàng),這有點(diǎn)煩人。我們可以通過添加鍵盤快捷鍵來重新加載配置來解決這個(gè)問題:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()
hs.reload()
end)
hs.alert.show("Config loaded")
我們現(xiàn)在將?+ ?+ ?+ 綁定R到一個(gè)函數(shù),該函數(shù)將重新加載配置并在屏幕上顯示一個(gè)簡單的警報(bào)橫幅幾秒鐘。
這里要提到的一個(gè)重要細(xì)節(jié)是hs.reload()破壞當(dāng)前的Lua解釋器并創(chuàng)建一個(gè)新解釋器。如果我們hs.reload()在此函數(shù)后面有任何代碼,則不會(huì)調(diào)用它。
花式配置重新加載
所以我們現(xiàn)在可以手動(dòng)強(qiáng)制重新加載,但是為什么我們甚至必須在計(jì)算機(jī)為我們做的時(shí)候這樣做呢?
以下代碼段引入了另一個(gè)新擴(kuò)展,pathwatcher它允許我們在文件更改時(shí)自動(dòng)重新加載配置:
function reloadConfig(files)
doReload = false
for _,file in pairs(files) do
if file:sub(-4) == ".lua" then
doReload = true
end
end
if doReload then
hs.reload()
end
end
myWatcher = hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", reloadConfig):start()
hs.alert.show("Config loaded")
關(guān)于這個(gè)例子有幾件值得打破的事情。首先,我們使用一個(gè)Lua函數(shù)來調(diào)用系統(tǒng)環(huán)境中os.getenv()的HOME變量。這將告訴我們您的主目錄在哪里。然后我們使用Lua的..運(yùn)算符將該字符串連接到我們知道的配置文件路徑的/.hammerspoon/一部分。這為我們提供了Hammerspoon配置目錄的完整路徑。
然后,我們使用此路徑創(chuàng)建一個(gè)新的路徑觀察器,并告訴它reloadConfig在.hammerspoon目錄中發(fā)生更改時(shí)調(diào)用我們的函數(shù)。然后我們立即調(diào)用start()路徑觀察器對象,因此它開始工作。
在這個(gè)例子中,我們將配置重新加載函數(shù)實(shí)現(xiàn)為一個(gè)單獨(dú)的命名函數(shù),我們將其作為參數(shù)傳遞給hs.pathwatcher.new()。無論是傳遞命名函數(shù)還是在線使用匿名函數(shù),完全取決于您。
此函數(shù)接受單個(gè)參數(shù),該參數(shù)是包含已修改的文件的所有名稱的表。它迭代該列表并檢查每個(gè)文件以查看它是否以.lua。如果任何Lua文件已被更改,它會(huì)告訴Hammerspoon銷毀當(dāng)前的Lua設(shè)置并重新加載其配置文件。
使用Spoons重新加載智能配置
Hammerspoon支持Lua插件,我們稱之為“Spoons”。它們允許任何人使用Hammerspoon的API構(gòu)建有用的功能,然后將其分發(fā)給其他人。
由于配置重新加載是許多用戶可能想要的東西,因此它是Spoon的理想候選者,并且在此處的官方Spoons存儲(chǔ)庫中存在一個(gè)。
首先,單擊Spoon網(wǎng)頁上的“下載”鏈接 - 這應(yīng)該下載Zip文件并將其解壓縮到您的Downloads文件夾,在該文件夾中將顯示一個(gè)勺子圖標(biāo)。打開該文件,Hammerspoon將自動(dòng)導(dǎo)入Spoon ~/.hammerspoon/Spoons/。
然后將以下內(nèi)容添加到您的init.lua完成中:
hs.loadSpoon("ReloadConfiguration")
spoon.ReloadConfiguration:start()
與應(yīng)用程序菜單交互
有時(shí),自動(dòng)化某事的唯一方法是與應(yīng)用程序的GUI交互,這不是理想的,但通常需要完成某些事情。
為了說明這一點(diǎn),我們將構(gòu)建一個(gè)熱鍵,在多個(gè)用戶代理字符串之間循環(huán)Safari(即它如何向Web服務(wù)器標(biāo)識(shí)自己)。要做到這一點(diǎn),你需要有Safari瀏覽器Develop啟用菜單,您可以通過勾選做Show Develop menu in menu bar在Safari→Preferences→Advanced。
function cycle_safari_agents()
hs.application.launchOrFocus("Safari")
local safari = hs.appfinder.appFromName("Safari")
local str_default = {"Develop", "User Agent", "Default (Automatically Chosen)"}
local str_ie10 = {"Develop", "User Agent", "Internet Explorer 10.0"}
local str_chrome = {"Develop", "User Agent", "Google Chrome — Windows"}
local default = safari:findMenuItem(str_default)
local ie10 = safari:findMenuItem(str_ie10)
local chrome = safari:findMenuItem(str_chrome)
if (default and default["ticked"]) then
safari:selectMenuItem(str_ie10)
hs.alert.show("IE10")
end
if (ie10 and ie10["ticked"]) then
safari:selectMenuItem(str_chrome)
hs.alert.show("Chrome")
end
if (chrome and chrome["ticked"]) then
safari:selectMenuItem(str_default)
hs.alert.show("Safari")
end
end
hs.hotkey.bind({"cmd", "alt", "ctrl"}, '7', cycle_safari_agents)
我們在這里做的是首先啟動(dòng)Safari或?qū)⑵鋷У角懊妫ㄈ绻呀?jīng)運(yùn)行)。這是任何菜單交互中的重要步驟 - 通常會(huì)禁用當(dāng)前未關(guān)注的應(yīng)用程序的菜單。
然后我們使用了對Safari本身的引用hs.appfinder.appFromName()。使用此對象,我們可以搜索可用的菜單項(xiàng)并與它們進(jìn)行交互。具體來說,我們正在尋找三個(gè)用戶代理字符串的當(dāng)前狀態(tài)Develop→User Agent。然后我們檢查它們中的哪一個(gè)被勾選,然后選擇下一個(gè)。
因此,反復(fù)按?+ ?+ ?+ 7將在默認(rèn)用戶代理字符串,IE10用戶代理和Chrome用戶代理之間循環(huán)。每次,我們都會(huì)顯示一個(gè)簡單的屏幕警報(bào),其中包含我們已循環(huán)訪問的用戶代理的名稱。
創(chuàng)建一個(gè)簡單的菜單欄項(xiàng)目
許多Mac實(shí)用程序在系統(tǒng)菜單欄中放置一個(gè)小圖標(biāo)來顯示其狀態(tài)并讓您與它們進(jìn)行交互。我們將使用兩個(gè)Hammerspoon的擴(kuò)展來為流行的實(shí)用程序添加一個(gè)非常簡單的替代品Caffeine。
caffeine = hs.menubar.new()
function setCaffeineDisplay(state)
if state then
caffeine:setTitle("AWAKE")
else
caffeine:setTitle("SLEEPY")
end
end
function caffeineClicked()
setCaffeineDisplay(hs.caffeinate.toggle("displayIdle"))
end
if caffeine then
caffeine:setClickCallback(caffeineClicked)
setCaffeineDisplay(hs.caffeinate.get("displayIdle"))
end
此代碼段將創(chuàng)建一個(gè)菜單欄項(xiàng),SLEEPY如果您的計(jì)算機(jī)在您不使用時(shí)允許其***睡眠狀態(tài),或者AWAKE它將拒絕睡眠,則會(huì)顯示該文本。的hs.caffeine擴(kuò)展提供以防止睡眠顯示的能力,但hs.menubar被提供的菜單欄項(xiàng)。
在這種情況下,我們創(chuàng)建菜單欄項(xiàng)并連接回調(diào)(在本例中caffeineClicked())以單擊菜單欄項(xiàng)上的事件。您還可以使用圖標(biāo)而不是文本,方法是在您的菜單欄對象中放置小圖像文件~/.hammerspoon/并使用該:setIcon()方法。有關(guān)此內(nèi)容hs.menubar的詳細(xì)信息,請參閱完整的API文檔。
對應(yīng)用程序事件做出反應(yīng)
使用hs.application.watcher回調(diào),我們可以對各種應(yīng)用程序級(jí)事件做出反應(yīng),例如正在啟動(dòng),退出,隱藏和激活的應(yīng)用程序。
我們可以通過創(chuàng)建一個(gè)非常簡單的回調(diào)來證明這一點(diǎn),這將確保當(dāng)您激活Finder應(yīng)用程序時(shí),它的所有窗口都將被帶到顯示器的前面。
function applicationWatcher(appName, eventType, appObject)
if (eventType == hs.application.watcher.activated) then
if (appName == "Finder") then
-- Bring all Finder windows forward when one gets activated
appObject:selectMenuItem({"Window", "Bring All to Front"})
end
end
end
appWatcher = hs.application.watcher.new(applicationWatcher)
appWatcher:start()
首先,我們定義一個(gè)接受三個(gè)參數(shù)的回調(diào)函數(shù),并在其中檢查觸發(fā)該函數(shù)的事件類型是否是一個(gè)被激活的應(yīng)用程序。然后我們檢查被激活的應(yīng)用程序是否是Finder。如果是,我們選擇其菜單項(xiàng)將其所有窗口都放在前面。
然后,我們創(chuàng)建一個(gè)應(yīng)用程序觀察器對象,它將調(diào)用我們的函數(shù),并告訴它啟動(dòng)。
請注意,我們保留了對watcher對象的引用,而不是簡單地調(diào)用hs.application.watcher.new(applicationWatcher):start()。這樣做的原因是,:stop()如果我們需要,我們可以稍后調(diào)用觀察者(例如,在重新加載我們的配置的函數(shù)中 - 有關(guān)如何自動(dòng)重新加載Hammerspoon配置的信息,請參閱Fancy Config Reloading示例)。
對wifi事件做出反應(yīng)
如果你使用MacBook,那么你家里可能有一個(gè)WiFi網(wǎng)絡(luò)。Hammerspoon在您到家并加入您的WiFi網(wǎng)絡(luò),或離家出走并離開網(wǎng)絡(luò)時(shí)觸發(fā)事件非常簡單。在這種情況下,我們將做一些簡單的事情并調(diào)整MacBook的音量,使其在您離家時(shí)為零(保護(hù)您免受在咖啡店打開MacBook并肆無忌憚地播放音樂的恥辱感)在家里玩?。?/p>
wifiWatcher = nil
homeSSID = "MyHomeNetwork"
lastSSID = hs.wifi.currentNetwork()
function ssidChangedCallback()
newSSID = hs.wifi.currentNetwork()
if newSSID == homeSSID and lastSSID ~= homeSSID then
-- We just joined our home WiFi network
hs.audiodevice.defaultOutputDevice():setVolume(25)
elseif newSSID ~= homeSSID and lastSSID == homeSSID then
-- We just departed our home WiFi network
hs.audiodevice.defaultOutputDevice():setVolume(0)
end
lastSSID = newSSID
end
wifiWatcher = hs.wifi.watcher.new(ssidChangedCallback)
wifiWatcher:start()
在這里,我們創(chuàng)建了一個(gè)回調(diào)函數(shù),將當(dāng)前WiFi網(wǎng)絡(luò)的名稱與之前網(wǎng)絡(luò)的名稱進(jìn)行比較,并檢查我們是否已從預(yù)定義的家庭網(wǎng)絡(luò)遷移到其他地方,反之亦然,然后用于hs.audiodevice調(diào)整系統(tǒng)容量。
對USB事件做出反應(yīng)
如果你有一件你希望能夠做出反應(yīng)的USB硬件,那么它就是你hs.usb.watcher的擴(kuò)展。在下面的示例中,我們將在插入掃描儀時(shí)自動(dòng)啟動(dòng)掃描儀軟件,然后在拔下掃描儀時(shí)終止軟件。
usbWatcher = nil
function usbDeviceCallback(data)
if (data["productName"] == "ScanSnap S1300i") then
if (data["eventType"] == "added") then
hs.application.launchOrFocus("ScanSnap Manager")
elseif (data["eventType"] == "removed") then
app = hs.appfinder.appFromName("ScanSnap Manager")
app:kill()
end
end
end
usbWatcher = hs.usb.watcher.new(usbDeviceCallback)
usbWatcher:start()
擊敗粘貼阻塞
您可能已經(jīng)注意到某些程序和網(wǎng)站非常努力阻止您粘貼密碼。他們似乎認(rèn)為它使它們更安全,但在高度加密的密碼管理器時(shí)代,這當(dāng)然是無稽之談。
幸運(yùn)的是,我們可以通過發(fā)出虛假鍵盤事件來鍵入剪貼板內(nèi)容來繞過它們的損壞:
hs.hotkey.bind({"cmd", "alt"}, "V", function() hs.eventtap.keyStrokes(hs.pasteboard.getContents()) end)
運(yùn)行AppleScript
有時(shí)您需要的自動(dòng)化被鎖定在一個(gè)應(yīng)用程序中,這似乎是不可能從Hammerspoon控制的,除了許多應(yīng)用程序通過AppleScript公開它們的功能,Hammerspoon可以為您執(zhí)行:
ok,result = hs.applescript('tell Application "iTunes" to artist of the current track as string')
hs.alert.show(result)
這將要求iTunes詢問當(dāng)前正在播放的曲目的藝術(shù)家,然后使用在屏幕上顯示該曲目hs.alert。
但是,在您急于開始編寫大量與iTunes相關(guān)的AppleScript之前,請查看本指南中的下一個(gè)條目。
控制iTunes / Spotify
使用hs.itunes和hs.spotify我們可以查詢/控制iTunes和Spotify的各個(gè)方面,例如,如果您需要在一個(gè)應(yīng)用程序和另一個(gè)應(yīng)用程序之間切換:
hs.itunes.pause()
hs.spotify.play()
hs.spotify.displayCurrentTrack()
在屏幕上繪圖
有時(shí)你找不到你的鼠標(biāo)指針。你確定你把它留在了某個(gè)地方,但它隱藏在你的一個(gè)顯示器上,擺動(dòng)鼠標(biāo)并沒有幫助你發(fā)現(xiàn)它。幸運(yùn)的是,我們可以查詢和控制鼠標(biāo)指針,我們可以在屏幕上繪制內(nèi)容,這意味著我們可以這樣做:
mouseCircle = nil
mouseCircleTimer = nil
function mouseHighlight()
-- Delete an existing highlight if it exists
if mouseCircle then
mouseCircle:delete()
if mouseCircleTimer then
mouseCircleTimer:stop()
end
end
-- Get the current co-ordinates of the mouse pointer
mousepoint = hs.mouse.getAbsolutePosition()
-- Prepare a big red circle around the mouse pointer
mouseCircle = hs.drawing.circle(hs.geometry.rect(mousepoint.x-40, mousepoint.y-40, 80, 80))
mouseCircle:setStrokeColor({["red"]=1,["blue"]=0,["green"]=0,["alpha"]=1})
mouseCircle:setFill(false)
mouseCircle:setStrokeWidth(5)
mouseCircle:show()
-- Set a timer to delete the circle after 3 seconds
mouseCircleTimer = hs.timer.doAfter(3, function() mouseCircle:delete() end)
end
hs.hotkey.bind({"cmd","alt","shift"}, "D", mouseHighlight)
目前支持幾種不同類型的繪圖對象 - 線條,圓形,方框,文本和圖像。不同的圖紙類型可以具有不同的屬性,這些屬性都在API文檔中完整記錄。
繪圖對象可以放在所有其他窗口的頂部,也可以放在桌面圖標(biāo)后面 - 這使得它們可以用于在屏幕頂部顯示上下文疊加層(例如鼠標(biāo)查找示例),并在所有窗口后面顯示更多永久性信息(例如人們使用GeekTool的各種狀態(tài)信息。
發(fā)送iMessage / SMS消息
coffeeShopWifi = "Baristartisan_Guest"
lastSSID = hs.wifi.currentNetwork()
wifiWatcher = nil
function ssidChanged()
newSSID = hs.wifi.currentNetwork()
if newSSID == coffeeShopWifi and lastSSID ~= coffeeShopWifi then
-- We have arrived at the coffee shop
hs.messages.iMessage("iphonefriend@hipstermail.com", "Hey! I'm at Baristartisan's, come join me!")
hs.messages.SMS("+1234567890", "Hey, you don't have an iPhone, but you should still come for a coffee")
end
end
wifiWatcher = hs.wifi.watcher.new(ssidChanged)
wifiWatcher:start()
正如您無疑注意到的,只要您的Mac到達(dá)您最喜愛的時(shí)尚咖啡店,這將向人們發(fā)送兩條消息。您需要配置OS X的消息應(yīng)用程序,并且可以發(fā)送iMessage和SMS(后者通過使用SMS Relay的iPhone)來實(shí)現(xiàn)此功能。
使用URL自動(dòng)化Hammerspoon
有時(shí)您需要自動(dòng)化自動(dòng)化工具,而Hammerspoon可以通過多種方式實(shí)現(xiàn)自動(dòng)化。我們在這里介紹的第一種方式是使用URL。特別是,以hammerspoon://。開頭的網(wǎng)址。鑒于這個(gè)簡單的片段:
hs.urlevent.bind("someAlert", function(eventName, params)
hs.alert.show("Received someAlert")
end)
我們現(xiàn)在為一個(gè)名為的事件綁定了一個(gè)URL事件處理程序,該事件someAlert將顯示一些屏幕上的文本警報(bào)。要在終端中觸發(fā)此事件,請運(yùn)行open -g hammerspoon://someAlert。許多應(yīng)用程序都能夠打開URL,因此這成為自動(dòng)化Hammerspoon采取某些行動(dòng)的一種非常簡單的方法。有關(guān)此更具體(和復(fù)雜)的示例,請參閱下一節(jié)。請注意,該-g選項(xiàng)open會(huì)導(dǎo)致URL在后臺(tái)打開,以避免打開Hammerspoon的控制臺(tái)窗口,或者讓它為鍵盤焦點(diǎn)。
具有Karabiner和URL的Hammerspoon的高級(jí)自動(dòng)化
注意:Karabiner目前不在macOS Sierra中工作。它的作者正在研究一個(gè)新版本。
在我們的第一個(gè)例子中,我們曾經(jīng)hs.hotkey將鍵盤快捷鍵綁定到Lua函數(shù),這是Hammerspoon可以做的最有用的事情之一。但是,這些熱鍵是在OS X中使用Carbon API執(zhí)行的,這在理解鍵盤事件方面是相當(dāng)高的 - 例如,它無法區(qū)分?按下哪個(gè)鍵(因?yàn)橛袃蓚€(gè),一個(gè)在鍵盤左側(cè),右側(cè)一個(gè)),也不能綁定涉及Fn鍵的熱鍵。
一個(gè)能夠以非常低的水平理解這些鍵盤事件的應(yīng)用程序是Karabiner,它連接到OS X內(nèi)核以讀取來自鍵盤的原始事件。通常它用于將這些鍵事件重新映射到其他鍵事件(即更改鍵盤上鍵的行為),但是,它也可以將低級(jí)鍵事件轉(zhuǎn)換為更高級(jí)別的系統(tǒng)操作,例如執(zhí)行終端命令,或者打開一個(gè)URL。
因此,我們可以結(jié)合Karabiner和Hammerspoon來執(zhí)行一些非常強(qiáng)大和靈活的熱鍵綁定。在這個(gè)例子中,我們將把一些鍵盤修飾符從鍵盤的右側(cè)綁定到Hammerspoon中的Lua函數(shù)。
首先,安裝Karabiner并打開其配置應(yīng)用程序在Misc & Uninstall選項(xiàng)卡中,單擊Open private.xml。這將顯示一個(gè)Finder窗口,顯示一個(gè)名為的文件private.xml。右鍵單擊該文件并選擇Open With → TextEdit.app。您現(xiàn)在將看到TextEdit打開,顯示XML文檔。如果您之前從未使用過Karabiner,它將包含:
在該部分中,添加以下內(nèi)容:
KeyCode::VK_OPEN_URL_HS_test1
hammerspoon://test1?someParam=hello
Hammerspoon test1
hammerspoon.test1
--KeyToKey--
KeyCode::CURSOR_RIGHT, ModifierFlag::CO***AND_R | ModifierFlag::OPTION_R,
KeyCode::VK_OPEN_URL_HS_test1
打破這一點(diǎn),我們首先使用該部分為Karabiner定義一個(gè)URL 。這里需要注意的是,屬性必須以KeyCode::VK_OPEN_URL并且不應(yīng)包含任何空格開頭。該選項(xiàng)意味著Karabiner將在不激活Hammerspoon的情況下打開URL。幾乎沒有理由想要將焦點(diǎn)轉(zhuǎn)移到Hammerspoon,因此建議您始終使用此選項(xiàng)。
將URL定義為虛擬鍵碼后,我們告訴Karabiner聽右手?,右手?和→光標(biāo)鍵。如果按下這些鍵,它將打開URL hammerspoon://test1?someParam=hello。
保存private.xml文檔并關(guān)閉TextEdit?,F(xiàn)在,在Karabiner中,切換回Change Key選項(xiàng)卡并單擊Reload XML。假設(shè)您沒有收到任何錯(cuò)誤,請勾選旁邊的框Hammerspoon test1并配置重新映射。
在您的Hammerspoon中init.lua,添加以下內(nèi)容:
hs.urlevent.bind("test1", function(eventName, params)
if params["someParam"] then
hs.alert.show(params["someParam"])
end
end)
你現(xiàn)在在Hammerspoon中有一個(gè)Lua函數(shù),如果按下right ?+ right ?+ ,它將被觸發(fā)→。
Hammerspoon Mac最新版功能演示
我都用 Hammerspoon 做了些什么?
菜單欄顯示最近幾天天氣情況
· 請求免費(fèi)的天氣 API,在深圳這個(gè)多雨的城市里提醒我別忘記帶傘。

· 剪切板歷史記錄
· 記錄剪貼板歷史,點(diǎn)擊某一項(xiàng)再重新復(fù)制。

· 音量調(diào)節(jié)快捷鍵
· 當(dāng)我使用外接鍵盤時(shí),自定義快捷鍵
cmd + up/down
調(diào)節(jié)系統(tǒng)音量

· 窗口管理
· 快捷鍵實(shí)現(xiàn)二分屏、三分屏和全屏

· Wi-Fi 自動(dòng)腳本
· 根據(jù) Wi-Fi SSID 判斷是否在公司還是在家,例如在家里自動(dòng)掛載 NAS 服務(wù)器,如果在公司 sshfs 掛載服務(wù)器目錄等。 
· 藍(lán)牙
耳機(jī)自動(dòng)連接
· 電腦鎖屏?xí)r,自動(dòng)斷開連接的藍(lán)牙耳機(jī),參考我的另一篇介紹。
· 輸入法自動(dòng)切換
· 在每個(gè) App 界面自動(dòng)切換成
搜狗輸入法
,配合搜狗輸入法自動(dòng)中英文切換,再也不用在系統(tǒng)默認(rèn)的英文輸入法和搜狗輸入法之間來回切換了。
· 定時(shí)自動(dòng)提交代碼
· 使用
hs.timer
定時(shí)器,定時(shí)自動(dòng)推送我的筆記和下載的電子書到 Github 倉庫。
· USB 設(shè)備連接記錄
· 記錄插上你電腦的每一個(gè) USB 設(shè)備信息,凡插過必留記錄。
· 消息推送
· 推送任意消息提醒
· TTS 發(fā)聲
· 調(diào)用
say hello world
合成 TTS,模擬真人發(fā)音,讓 Mac 會(huì)說話。
· 更多... (完全停不下來啊)
其他插件思路
· 番茄鐘
· 應(yīng)用搜索
· 桌面小部件

小編的話
Hammerspoon for Mac版一個(gè)小而簡單的實(shí)用程序,Hammerspoon為您提供了一種快速簡便的方式來與窗口,鼠標(biāo)指針,文件系統(tǒng)對象,電池,屏幕,鍵盤和剪貼板以及位置服務(wù),Wi-Fi和其他設(shè)備進(jìn)行交互。Hammerspoon是一個(gè)有用且必備的自動(dòng)化工具,適合任何愿意通過盡可能使用鍵盤專注于應(yīng)用程序交互來提高生產(chǎn)力的人員!
下載地址
人氣軟件

Cherry Studio AI桌面客戶端 v1.9.6 Mac官方中文版(Intel/Apple
Mac html5 插件 for mac V1.1 蘋果電腦版
BookReader for Mac(電子書閱讀軟件) v5.15 (7) 直裝激活版
郵箱大師 for MAC版 1.0 官方蘋果電腦版
FinalShell(SSH工具) v4.6.3 Mac 蘋果電腦最新版
ps濾鏡合集(Perfect Photo Suite 9 Premium Edition) for Mac 蘋
Hardware Monitor for Mac(硬件檢測軟件) v5.2 蘋果電腦版
InsomniaX for mac V2.1.6 蘋果電腦版
Dynamic Wallpaper Enginer for Mac 動(dòng)態(tài)壁紙 v17.5 中文版
MacDroid Pro for Mac(高效安卓手機(jī)數(shù)據(jù)傳輸工具) v2.4 中文免費(fèi)
相關(guān)文章
Koodo Reader for mac(電子書閱讀器) v2.3.4 蘋果電腦Apple版Koodo Reader mac版是一款功能強(qiáng)大的跨平臺(tái)電子書閱讀器,格式支持 epub, pdf, mobi, azw3, txt, djvu, markdown, fb2, cbz, cbt, cbr, rtf 和 docx...
掃一掃 for mac(掃碼軟件) v1.0.1 蘋果電腦版掃一掃是行業(yè)頂尖的掃描識(shí)別應(yīng)用,識(shí)別算法解決了模糊、缺失、彎曲、強(qiáng)光、弱光、亂碼、反白等各種極端場景下掃碼問題,操作簡單方便,無需精確對準(zhǔn),可快速識(shí)別...
如快sofast(快速啟動(dòng)器) for mac v0.9.6 蘋果電腦版 適用m芯片如快mac版是一款高效的辦公啟動(dòng)器工具,通過快捷鍵即時(shí)啟動(dòng)應(yīng)用和文件,支持拼音模糊搜索、剪貼板管理與插件擴(kuò)展,幫助用戶提升工作效率...
sofast如快 for mac(快速啟動(dòng)器) v0.9.6 蘋果電腦版如快mac版是一款高效的辦公啟動(dòng)器工具,通過快捷鍵即時(shí)啟動(dòng)應(yīng)用和文件,支持拼音模糊搜索、剪貼板管理與插件擴(kuò)展,幫助用戶提升工作效率...
白瓜音頻(AI面試助手)for mac v2.1.5 蘋果電腦通用版白瓜音頻利用大模型一鍵幫你回答面試問題,提前押題,幫你查漏補(bǔ)缺;擬真練習(xí),讓你在真實(shí)面試中保持自信等,本站提供的是這款軟件的mac通用安裝包...
赤友右鍵超人(Mac右鍵菜單工具) for mac v4.2 蘋果電腦版赤友右鍵超人旨在增強(qiáng)Mac電腦的右鍵菜單,讓macOS“新建文件、剪切文件、移動(dòng)文件到、復(fù)制文件到、快速訪問, 軟件卸載,重復(fù)文件清理, 磁盤空間分析”等操作,就像在Window...
下載聲明
☉ 解壓密碼:m.fzitv.net 就是本站主域名,希望大家看清楚,[ 分享碼的獲取方法 ]可以參考這篇文章
☉ 推薦使用 [ 迅雷 ] 下載,使用 [ WinRAR v5 ] 以上版本解壓本站軟件。
☉ 如果這個(gè)軟件總是不能下載的請?jiān)谠u論中留言,我們會(huì)盡快修復(fù),謝謝!
☉ 下載本站資源,如果服務(wù)器暫不能下載請過一段時(shí)間重試!或者多試試幾個(gè)下載地址
☉ 如果遇到什么問題,請?jiān)u論留言,我們定會(huì)解決問題,謝謝大家支持!
☉ 本站提供的一些商業(yè)軟件是供學(xué)習(xí)研究之用,如用于商業(yè)用途,請購買正版。
☉ 本站提供的Hammerspoon for Mac(OS X桌面自動(dòng)化神器) v0.9.95 蘋果電腦版資源來源互聯(lián)網(wǎng),版權(quán)歸該下載資源的合法擁有者所有。



