呆貓桌面云 for Mac V1.20.3 蘋果電腦版203MB / 12-29
OnTime PRO for Mac(桌面時鐘工具) v3.2 直裝激活版72.1MB / 07-17
天翼云電腦 for Mac v2.1.0 蘋果電腦版96.7MB / 01-11
Digital Clock 3D for Mac(3D數(shù)字時鐘動態(tài)桌面) v2.1.1 免費激活64.2MB / 08-02
Firework for Mac(Web應(yīng)用轉(zhuǎn)桌面程序) V3.0.37.8 蘋果電腦版126MB / 03-25
Desktop Curtain(桌面圖標快速隱藏軟件) 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ù)字時鐘) for Mac V4.7.8 蘋果電腦版22.7MB / 05-26
-
Cherry Studio AI桌面客戶端 v1.2.6 Mac官方中文版(Intel/Apple 其他軟件 / 228MB
-
-
Deskflow(鍵盤鼠標共享工具) v1.21.2 蘋果電腦版 支持m1芯片 其他軟件 / 29.5 MB
-
Deskflow for mac(鍵盤鼠標共享工具) v1.21.2 蘋果電腦版 其他軟件 / 28.8 MB
-
都玩投屏(手機投屏電腦端) for mac v4.4.0.0 蘋果電腦版 其他軟件 / 35.4 MB
-
-
-
Scholaread靠岸學(xué)術(shù)(論文閱讀器)v1.1.41 Apple芯片版 其他軟件 / 125MB
-
Scholaread靠岸學(xué)術(shù)(論文閱讀器)v1.1.41 Intel芯片版 其他軟件 / 131MB
-
詳情介紹
hammerspoon mac版是一款簡單而強大的macOS自動化工具,它為您提供了一個合適的環(huán)境,用于編寫Lua代碼腳本,用于設(shè)置可以使用全局熱鍵組合觸發(fā)的自動操作。簡而言之,Hammerspoon將系統(tǒng)API橋接到一個簡單的Lua腳本引擎,這意味著它使您能夠編寫Lua腳本以自動執(zhí)行各種自動化任務(wù)。

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

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

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菜單欄圖標并選擇Reload Config。您現(xiàn)在應(yīng)該發(fā)現(xiàn)按?+ ?+ ctrl+ W將在屏幕上顯示Hello World通知。
這里發(fā)生的是我們告訴Hammerspoon將匿名函數(shù)綁定到特定的熱鍵。熱鍵是通過修飾鍵的表(指定?,?并且ctrl在這種情況下)和正常鍵(W)。匿名函數(shù)只是一個沒有名稱的函數(shù)。我們可以使用名稱單獨定義警報功能并將該名稱傳遞給hs.hotkey.bind(),但是Lua可以很容易地定義內(nèi)聯(lián)函數(shù)。
發(fā)燒友你好世界
雖然hs.alert很有用,但您可能更喜歡使用OS X本機通知,只需將上一個示例修改為:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.notify.new({title="Hammerspoon", informativeText="Hello World"}):send()
end)
窗戶運動簡介
使用Hammerspoon可以做的最直接有用的事情之一是操縱屏幕上的窗口。我們將從一個簡單的例子開始,并構(gòu)建一個更復(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使當前聚焦的窗口向左移動10個像素。您可以看到我們獲取當前聚焦的窗口然后獲取其幀。這描述了窗口的位置和大小。然后我們可以修改框架并使用它將其應(yīng)用回窗口setFrame()。
快速結(jié)束冒號語法
您可能已經(jīng)注意到,有時我們在函數(shù)調(diào)用中使用點,有時我們使用冒號。冒號語法意味著您正在調(diào)用該對象的方法之一。它仍然是一個函數(shù)調(diào)用,但它隱式地將對象作為self參數(shù)傳遞給方法。
快速關(guān)注可變生命周期
Lua使用垃圾收集來清理其內(nèi)存使用情況 - 它認為不再使用的任何對象將在未來的某個時刻被銷毀(確切地說,何時,可能非常不可預(yù)測,但它基于您的Lua代碼的活躍程度) 。
這意味著一旦函數(shù)/循環(huán)執(zhí)行完畢,只存在于函數(shù)/ loop / etc中的變量將可用于垃圾收集。這包括您的init.lua,它被認為是在最后一行代碼運行時完成的單個范圍。
如果您在自己中創(chuàng)建任何對象init.lua,則必須在變量中捕獲它們,否則將來會在某些時候以靜默方式銷毀它們。例如:
hs.pathwatcher.new(.....):start()
此處返回的對象(一個hs.pathwatcher對象)未被捕獲,因此只要init.lua完成,它就可用于垃圾收集。它可能不會在幾分鐘/幾小時后被銷毀,但是你會感到困惑,為什么你的pathwatcher沒有運行。相反,這個版本將繼續(xù)存在,直到您重新加載配置,或退出Hammerspoon:
myWatcher = hs.pathwatcher.new(.....):start()
該myWatcher變量是一個全局變量,所以永遠不會走出去的范圍。
關(guān)于變量的生命周期 - 在Console窗口中,每次鍵入一行并按Enter鍵時,都會創(chuàng)建,執(zhí)行和完成不同的Lua范圍。這意味著local當您按Enter鍵時,在控制臺窗口中創(chuàng)建的變量將立即變得不可訪問,因為它們的范圍已關(guān)閉。
更復(fù)雜的窗口移動
我們可以在簡單的窗口移動示例的基礎(chǔ)上構(gòu)建一組鍵盤快捷鍵,允許我們使用nethack移動鍵在所有方向上移動窗口:
y k u
h l
b j n
要做到這一點,我們只需要hs.hotkey.bind()稍微不同的幀修改重復(fù)前一個調(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é)中,我們將實現(xiàn)移動窗口的常見窗口管理功能,使其占據(jù)屏幕的左半部分或右半部分,允許您為Productivity™平鋪兩個彼此相鄰的窗口。
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+ ←(如左光標鍵)綁定到將獲取聚焦窗口的函數(shù),然后獲取聚焦窗口所在的屏幕,獲取屏幕的框架(注意hs.screen.frame()不包括菜單欄)和??浚纯磆s.screen.fullFrame()你是否需要)并設(shè)置窗口的框架占據(jù)屏幕的左半部分。
為了解決這個問題,我們將添加一個函數(shù)將窗口移動到屏幕的右半部分:
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)
這里一個很好的練習(xí)是看你現(xiàn)在是否可以為自己編寫功能,將上/下光標鍵綁定到分別調(diào)整窗口的上半部/下半部分。
多窗口布局
當您想要保持多個應(yīng)用程序一直打開,并以特定方式安排其窗口時,您可以使用hs.layout擴展名:
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)
為了解決這個問題,我們首先在Mac上創(chuàng)建一個帶有主屏幕名稱的變量。您可以:name()在hs.screen對象上使用該方法找到這些名稱(例如hs.screen.allScreens()[1]:name(),在Hammerspoon控制臺中鍵入)。
然后,我們創(chuàng)建一個描述所需布局的表。表中的每個條目windowLayout都是另一個表,它選擇我們感興趣的窗口,并指定它們所需的位置和大小。
表格中的第一項是我們希望影響的應(yīng)用程序的名稱,第二項是我們希望影響的窗口的標題。這些項目中的任何一項都可以nil,但不能兩者兼而有之。如果應(yīng)用程序名稱是,nil那么我們將匹配所有應(yīng)用程序中的給定窗口標題。如果窗口標題項是,nil那么我們將匹配給定應(yīng)用程序的所有窗口。
第四,第五和第六項用于以不同方式描述匹配窗口的布局。只有這些項目中的一個可具有一個值,并且該值應(yīng)為包含四個項目,一個表x,y,w和h(水平位置,垂直位置,寬度和高度,分別地)。
第四項是將給予的矩形hs.window:moveToUnit()。的x,y,w,和h該矩形的值,是值之間0.0并且1.0,允許你位置的窗口作為顯示器的級分,而不必關(guān)心顯示器的精確分辨率(例如hs.layout.left50是一個預(yù)先定義的矩形{x=0, y=0, w=0.5, h=1})。
第五項是一個矩形,它將被賦予hs.window:setFrame()并應(yīng)該將位置/大小值指定為屏幕上的像素位置,但不考慮OS菜單欄和底座。
第六個項目類似于第五個項目,但它確實考慮了操作系統(tǒng)菜單欄和???。這在上面的示例中顯示,它將iTunes Mini Player窗口置于屏幕的最左下方,即使底座在那里也是如此。請注意,我們使用hs.geometry.rect()輔助函數(shù)來構(gòu)造rect表,并且y值為負,這意味著窗口的頂部應(yīng)該在顯示屏底部上方48像素處開始。
這可能看起來是一組相當復(fù)雜的選項,但是值得花一些時間學(xué)習(xí),因為它允許非常強大的窗口布局,特別是對系統(tǒng)事件的反應(yīng)(例如插入監(jiān)視器時屏幕數(shù)量的變化,或者甚至只需按一個特定的熱鍵即可恢復(fù)窗戶的健康狀況。
窗口過濾器
在某些上下文或應(yīng)用程序中綁定熱鍵而不是其他熱鍵不是很有用嗎?組織窗口并根據(jù)位置,大小,工作流程或其任何組合對事件做出反應(yīng)?極其通用的hs.window.filter模塊允許您使用過濾規(guī)則和事件監(jiān)視器創(chuàng)建復(fù)雜的窗口分組和行為。展示該模塊功能的最佳方式是通過示例。
將內(nèi)容從Safari復(fù)制并粘貼到Messages.app時,所有鏈接都在不斷擴展,使文本難以閱讀:
Thrushes make up the Turdidae, a family of passerine birds that occurs worldwide.
只有Safari / Messages對受此影響,而其他OS X應(yīng)用程序通常會毫發(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默認情況下,通過初始化來創(chuàng)建空窗口過濾器以排除所有窗口。添加了消息'appfilter',以便此窗口過濾器僅觀察消息窗口。然后我們訂閱windowfilter,以便cleanPasteboard每次Message窗口獲得焦點時都會調(diào)用它。當某些窗口或應(yīng)用程序具有焦點時,您可以類似地啟用/禁用自定義熱鍵。
Windowfilters是動態(tài)的,根據(jù)約束集在后臺自動過濾。通過使用謂詞函數(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)
此窗口過濾器包含所有標準(非隱藏,非模態(tài))窗口,這些窗口共享當前聚焦窗口的應(yīng)用程序和屏幕。窗口過濾器不斷更新,以便當前聚焦的窗口確定正在播放的窗口組。這可用于使用hs.window.switcher或您自己的自定義循環(huán)器在當前屏幕上循環(huán)使用聚焦的應(yīng)用程序窗口。
簡單的配置重新加載
您可能已經(jīng)注意到,在編輯配置時,Reload Config每次進行更改時都必須繼續(xù)選擇菜單項,這有點煩人。我們可以通過添加鍵盤快捷鍵來重新加載配置來解決這個問題:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()
hs.reload()
end)
hs.alert.show("Config loaded")
我們現(xiàn)在將?+ ?+ ?+ 綁定R到一個函數(shù),該函數(shù)將重新加載配置并在屏幕上顯示一個簡單的警報橫幅幾秒鐘。
這里要提到的一個重要細節(jié)是hs.reload()破壞當前的Lua解釋器并創(chuàng)建一個新解釋器。如果我們hs.reload()在此函數(shù)后面有任何代碼,則不會調(diào)用它。
花式配置重新加載
所以我們現(xiàn)在可以手動強制重新加載,但是為什么我們甚至必須在計算機為我們做的時候這樣做呢?
以下代碼段引入了另一個新擴展,pathwatcher它允許我們在文件更改時自動重新加載配置:
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)于這個例子有幾件值得打破的事情。首先,我們使用一個Lua函數(shù)來調(diào)用系統(tǒng)環(huán)境中os.getenv()的HOME變量。這將告訴我們您的主目錄在哪里。然后我們使用Lua的..運算符將該字符串連接到我們知道的配置文件路徑的/.hammerspoon/一部分。這為我們提供了Hammerspoon配置目錄的完整路徑。
然后,我們使用此路徑創(chuàng)建一個新的路徑觀察器,并告訴它reloadConfig在.hammerspoon目錄中發(fā)生更改時調(diào)用我們的函數(shù)。然后我們立即調(diào)用start()路徑觀察器對象,因此它開始工作。
在這個例子中,我們將配置重新加載函數(shù)實現(xiàn)為一個單獨的命名函數(shù),我們將其作為參數(shù)傳遞給hs.pathwatcher.new()。無論是傳遞命名函數(shù)還是在線使用匿名函數(shù),完全取決于您。
此函數(shù)接受單個參數(shù),該參數(shù)是包含已修改的文件的所有名稱的表。它迭代該列表并檢查每個文件以查看它是否以.lua。如果任何Lua文件已被更改,它會告訴Hammerspoon銷毀當前的Lua設(shè)置并重新加載其配置文件。
使用Spoons重新加載智能配置
Hammerspoon支持Lua插件,我們稱之為“Spoons”。它們允許任何人使用Hammerspoon的API構(gòu)建有用的功能,然后將其分發(fā)給其他人。
由于配置重新加載是許多用戶可能想要的東西,因此它是Spoon的理想候選者,并且在此處的官方Spoons存儲庫中存在一個。
首先,單擊Spoon網(wǎng)頁上的“下載”鏈接 - 這應(yīng)該下載Zip文件并將其解壓縮到您的Downloads文件夾,在該文件夾中將顯示一個勺子圖標。打開該文件,Hammerspoon將自動導(dǎo)入Spoon ~/.hammerspoon/Spoons/。
然后將以下內(nèi)容添加到您的init.lua完成中:
hs.loadSpoon("ReloadConfiguration")
spoon.ReloadConfiguration:start()
與應(yīng)用程序菜單交互
有時,自動化某事的唯一方法是與應(yīng)用程序的GUI交互,這不是理想的,但通常需要完成某些事情。
為了說明這一點,我們將構(gòu)建一個熱鍵,在多個用戶代理字符串之間循環(huán)Safari(即它如何向Web服務(wù)器標識自己)。要做到這一點,你需要有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)
我們在這里做的是首先啟動Safari或?qū)⑵鋷У角懊妫ㄈ绻呀?jīng)運行)。這是任何菜單交互中的重要步驟 - 通常會禁用當前未關(guān)注的應(yīng)用程序的菜單。
然后我們使用了對Safari本身的引用hs.appfinder.appFromName()。使用此對象,我們可以搜索可用的菜單項并與它們進行交互。具體來說,我們正在尋找三個用戶代理字符串的當前狀態(tài)Develop→User Agent。然后我們檢查它們中的哪一個被勾選,然后選擇下一個。
因此,反復(fù)按?+ ?+ ?+ 7將在默認用戶代理字符串,IE10用戶代理和Chrome用戶代理之間循環(huán)。每次,我們都會顯示一個簡單的屏幕警報,其中包含我們已循環(huán)訪問的用戶代理的名稱。
創(chuàng)建一個簡單的菜單欄項目
許多Mac實用程序在系統(tǒng)菜單欄中放置一個小圖標來顯示其狀態(tài)并讓您與它們進行交互。我們將使用兩個Hammerspoon的擴展來為流行的實用程序添加一個非常簡單的替代品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)建一個菜單欄項,SLEEPY如果您的計算機在您不使用時允許其***睡眠狀態(tài),或者AWAKE它將拒絕睡眠,則會顯示該文本。的hs.caffeine擴展提供以防止睡眠顯示的能力,但hs.menubar被提供的菜單欄項。
在這種情況下,我們創(chuàng)建菜單欄項并連接回調(diào)(在本例中caffeineClicked())以單擊菜單欄項上的事件。您還可以使用圖標而不是文本,方法是在您的菜單欄對象中放置小圖像文件~/.hammerspoon/并使用該:setIcon()方法。有關(guān)此內(nèi)容hs.menubar的詳細信息,請參閱完整的API文檔。
對應(yīng)用程序事件做出反應(yīng)
使用hs.application.watcher回調(diào),我們可以對各種應(yīng)用程序級事件做出反應(yīng),例如正在啟動,退出,隱藏和激活的應(yīng)用程序。
我們可以通過創(chuàng)建一個非常簡單的回調(diào)來證明這一點,這將確保當您激活Finder應(yīng)用程序時,它的所有窗口都將被帶到顯示器的前面。
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()
首先,我們定義一個接受三個參數(shù)的回調(diào)函數(shù),并在其中檢查觸發(fā)該函數(shù)的事件類型是否是一個被激活的應(yīng)用程序。然后我們檢查被激活的應(yīng)用程序是否是Finder。如果是,我們選擇其菜單項將其所有窗口都放在前面。
然后,我們創(chuàng)建一個應(yīng)用程序觀察器對象,它將調(diào)用我們的函數(shù),并告訴它啟動。
請注意,我們保留了對watcher對象的引用,而不是簡單地調(diào)用hs.application.watcher.new(applicationWatcher):start()。這樣做的原因是,:stop()如果我們需要,我們可以稍后調(diào)用觀察者(例如,在重新加載我們的配置的函數(shù)中 - 有關(guān)如何自動重新加載Hammerspoon配置的信息,請參閱Fancy Config Reloading示例)。
對wifi事件做出反應(yīng)
如果你使用MacBook,那么你家里可能有一個WiFi網(wǎng)絡(luò)。Hammerspoon在您到家并加入您的WiFi網(wǎng)絡(luò),或離家出走并離開網(wǎng)絡(luò)時觸發(fā)事件非常簡單。在這種情況下,我們將做一些簡單的事情并調(diào)整MacBook的音量,使其在您離家時為零(保護您免受在咖啡店打開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)建了一個回調(diào)函數(shù),將當前WiFi網(wǎng)絡(luò)的名稱與之前網(wǎng)絡(luò)的名稱進行比較,并檢查我們是否已從預(yù)定義的家庭網(wǎng)絡(luò)遷移到其他地方,反之亦然,然后用于hs.audiodevice調(diào)整系統(tǒng)容量。
對USB事件做出反應(yīng)
如果你有一件你希望能夠做出反應(yīng)的USB硬件,那么它就是你hs.usb.watcher的擴展。在下面的示例中,我們將在插入掃描儀時自動啟動掃描儀軟件,然后在拔下掃描儀時終止軟件。
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)站非常努力阻止您粘貼密碼。他們似乎認為它使它們更安全,但在高度加密的密碼管理器時代,這當然是無稽之談。
幸運的是,我們可以通過發(fā)出虛假鍵盤事件來鍵入剪貼板內(nèi)容來繞過它們的損壞:
hs.hotkey.bind({"cmd", "alt"}, "V", function() hs.eventtap.keyStrokes(hs.pasteboard.getContents()) end)
運行AppleScript
有時您需要的自動化被鎖定在一個應(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詢問當前正在播放的曲目的藝術(shù)家,然后使用在屏幕上顯示該曲目hs.alert。
但是,在您急于開始編寫大量與iTunes相關(guān)的AppleScript之前,請查看本指南中的下一個條目。
控制iTunes / Spotify
使用hs.itunes和hs.spotify我們可以查詢/控制iTunes和Spotify的各個方面,例如,如果您需要在一個應(yīng)用程序和另一個應(yīng)用程序之間切換:
hs.itunes.pause()
hs.spotify.play()
hs.spotify.displayCurrentTrack()
在屏幕上繪圖
有時你找不到你的鼠標指針。你確定你把它留在了某個地方,但它隱藏在你的一個顯示器上,擺動鼠標并沒有幫助你發(fā)現(xiàn)它。幸運的是,我們可以查詢和控制鼠標指針,我們可以在屏幕上繪制內(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文檔中完整記錄。
繪圖對象可以放在所有其他窗口的頂部,也可以放在桌面圖標后面 - 這使得它們可以用于在屏幕頂部顯示上下文疊加層(例如鼠標查找示例),并在所有窗口后面顯示更多永久性信息(例如人們使用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到達您最喜愛的時尚咖啡店,這將向人們發(fā)送兩條消息。您需要配置OS X的消息應(yīng)用程序,并且可以發(fā)送iMessage和SMS(后者通過使用SMS Relay的iPhone)來實現(xiàn)此功能。
使用URL自動化Hammerspoon
有時您需要自動化自動化工具,而Hammerspoon可以通過多種方式實現(xiàn)自動化。我們在這里介紹的第一種方式是使用URL。特別是,以hammerspoon://。開頭的網(wǎng)址。鑒于這個簡單的片段:
hs.urlevent.bind("someAlert", function(eventName, params)
hs.alert.show("Received someAlert")
end)
我們現(xiàn)在為一個名為的事件綁定了一個URL事件處理程序,該事件someAlert將顯示一些屏幕上的文本警報。要在終端中觸發(fā)此事件,請運行open -g hammerspoon://someAlert。許多應(yīng)用程序都能夠打開URL,因此這成為自動化Hammerspoon采取某些行動的一種非常簡單的方法。有關(guān)此更具體(和復(fù)雜)的示例,請參閱下一節(jié)。請注意,該-g選項open會導(dǎo)致URL在后臺打開,以避免打開Hammerspoon的控制臺窗口,或者讓它為鍵盤焦點。
具有Karabiner和URL的Hammerspoon的高級自動化
注意:Karabiner目前不在macOS Sierra中工作。它的作者正在研究一個新版本。
在我們的第一個例子中,我們曾經(jīng)hs.hotkey將鍵盤快捷鍵綁定到Lua函數(shù),這是Hammerspoon可以做的最有用的事情之一。但是,這些熱鍵是在OS X中使用Carbon API執(zhí)行的,這在理解鍵盤事件方面是相當高的 - 例如,它無法區(qū)分?按下哪個鍵(因為有兩個,一個在鍵盤左側(cè),右側(cè)一個),也不能綁定涉及Fn鍵的熱鍵。
一個能夠以非常低的水平理解這些鍵盤事件的應(yīng)用程序是Karabiner,它連接到OS X內(nèi)核以讀取來自鍵盤的原始事件。通常它用于將這些鍵事件重新映射到其他鍵事件(即更改鍵盤上鍵的行為),但是,它也可以將低級鍵事件轉(zhuǎn)換為更高級別的系統(tǒng)操作,例如執(zhí)行終端命令,或者打開一個URL。
因此,我們可以結(jié)合Karabiner和Hammerspoon來執(zhí)行一些非常強大和靈活的熱鍵綁定。在這個例子中,我們將把一些鍵盤修飾符從鍵盤的右側(cè)綁定到Hammerspoon中的Lua函數(shù)。
首先,安裝Karabiner并打開其配置應(yīng)用程序在Misc & Uninstall選項卡中,單擊Open private.xml。這將顯示一個Finder窗口,顯示一個名為的文件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
打破這一點,我們首先使用該部分為Karabiner定義一個URL 。這里需要注意的是,屬性必須以KeyCode::VK_OPEN_URL并且不應(yīng)包含任何空格開頭。該選項意味著Karabiner將在不激活Hammerspoon的情況下打開URL。幾乎沒有理由想要將焦點轉(zhuǎn)移到Hammerspoon,因此建議您始終使用此選項。
將URL定義為虛擬鍵碼后,我們告訴Karabiner聽右手?,右手?和→光標鍵。如果按下這些鍵,它將打開URL hammerspoon://test1?someParam=hello。
保存private.xml文檔并關(guān)閉TextEdit?,F(xiàn)在,在Karabiner中,切換回Change Key選項卡并單擊Reload XML。假設(shè)您沒有收到任何錯誤,請勾選旁邊的框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中有一個Lua函數(shù),如果按下right ?+ right ?+ ,它將被觸發(fā)→。
Hammerspoon Mac最新版功能演示
我都用 Hammerspoon 做了些什么?
菜單欄顯示最近幾天天氣情況
· 請求免費的天氣 API,在深圳這個多雨的城市里提醒我別忘記帶傘。

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

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

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

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

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

Cherry Studio AI桌面客戶端 v1.2.6 Mac官方中文版(Intel/Apple
Mac html5 插件 for mac V1.1 蘋果電腦版
BookReader for Mac(電子書閱讀軟件) v5.15 (7) 直裝激活版
郵箱大師 for MAC版 1.0 官方蘋果電腦版
ps濾鏡合集(Perfect Photo Suite 9 Premium Edition) for Mac 蘋
Hardware Monitor for Mac(硬件檢測軟件) v5.2 蘋果電腦版
InsomniaX for mac V2.1.6 蘋果電腦版
FinalShell(SSH工具) v4.5.12 Mac 蘋果電腦最新版
Gifrocket for mac(視頻轉(zhuǎn)換為gif圖片) V0.1.2 蘋果電腦版
Dynamic Wallpaper Enginer for Mac 動態(tài)壁紙 v17.5 中文版
相關(guān)文章
Deskflow(鍵盤鼠標共享工具) v1.21.2 蘋果電腦版 支持m1芯片Deskflow mac版是一款免費且開源的多設(shè)備鍵盤鼠標共享工具,通過Deskflow,您的鍵盤和鼠標可以在多臺設(shè)備間自由切換,功能堪比“軟件版KVM切換器”...
Deskflow for mac(鍵盤鼠標共享工具) v1.21.2 蘋果電腦版Deskflow mac版是一款免費且開源的多設(shè)備鍵盤鼠標共享工具,通過Deskflow,您的鍵盤和鼠標可以在多臺設(shè)備間自由切換,功能堪比“軟件版KVM切換器”...
Uotan Toolbox(柚壇刷機工具箱) v3.3.5 Mac官方免費版Uotan Toolbox(柚壇工具箱)是一款基于C#語言開發(fā)的開源圖形用戶界面(GUI)程序,專為滿足刷機愛好者的需求而設(shè)計,它集成了多種必要的刷機工具,旨在簡化刷機流程,讓玩機...
DockDoor 窗口切換快速預(yù)覽小工具 v1.2.9 蘋果電腦版DockDoor是一款免費開源專為MAC打造的dock欄窗口預(yù)覽及切換小工具,采用Swift 和 SwiftUI開發(fā),引入跟Windows系統(tǒng)一樣的窗口預(yù)覽體驗...
LinkAndroid(安卓電腦互聯(lián)助手) v0.6.0 inter/Apple芯片 Mac官方免費版LinkAndroid 是一款專為安卓設(shè)備與電腦連接設(shè)計的全能手機連接助手,方便快捷的連接 Android 和電腦,連接手機后可投屏、GIF/MP4錄屏、截屏、文件管理、手機操作等功能...
Cherry Studio AI桌面客戶端 v1.2.6 Mac官方中文版(Intel/Apple Silicon)Cherry Studio 是一個支持多款人工智能大語言模型的桌面客戶端,可以快速切換不同的模型回答問題,開源免費,Cherry Studio 支持多款國內(nèi)外最先進的AI大語言模型,AI 響應(yīng)...
下載聲明
☉ 解壓密碼:www.dhdzp.com 就是本站主域名,希望大家看清楚,[ 分享碼的獲取方法 ]可以參考這篇文章
☉ 推薦使用 [ 迅雷 ] 下載,使用 [ WinRAR v5 ] 以上版本解壓本站軟件。
☉ 如果這個軟件總是不能下載的請在評論中留言,我們會盡快修復(fù),謝謝!
☉ 下載本站資源,如果服務(wù)器暫不能下載請過一段時間重試!或者多試試幾個下載地址
☉ 如果遇到什么問題,請評論留言,我們定會解決問題,謝謝大家支持!
☉ 本站提供的一些商業(yè)軟件是供學(xué)習(xí)研究之用,如用于商業(yè)用途,請購買正版。
☉ 本站提供的Hammerspoon for Mac(OS X桌面自動化神器) v0.9.95 蘋果電腦版資源來源互聯(lián)網(wǎng),版權(quán)歸該下載資源的合法擁有者所有。



