欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hammerspoon for Mac(OS X桌面自動(dòng)化神器) v0.9.95 蘋(píng)果電腦版

Hammerspoon Mac版下載

  • 軟件大?。?span>18.9MB
  • 軟件語(yǔ)言:英文軟件
  • 軟件類(lèi)型:國(guó)外軟件
  • 軟件授權(quán):免費(fèi)軟件
  • 軟件類(lèi)別:其他軟件
  • 應(yīng)用平臺(tái):macOS 11.x
  • 更新時(shí)間:2022-03-09
  • 網(wǎng)友評(píng)分:
360通過(guò) 騰訊通過(guò) 金山通過(guò)

情介紹

hammerspoon mac版是一款簡(jiǎn)單而強(qiáng)大的macOS自動(dòng)化工具,它為您提供了一個(gè)合適的環(huán)境,用于編寫(xiě)Lua代碼腳本,用于設(shè)置可以使用全局熱鍵組合觸發(fā)的自動(dòng)操作。簡(jiǎn)而言之,Hammerspoon將系統(tǒng)API橋接到一個(gè)簡(jiǎn)單的Lua腳本引擎,這意味著它使您能夠編寫(xiě)Lua腳本以自動(dòng)執(zhí)行各種自動(dòng)化任務(wù)。

Hammerspoon Mac版安裝教程

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

Hammerspoon Mac最新版軟件介紹

Hammerspoon是OS X的桌面自動(dòng)化工具。它將各種系統(tǒng)級(jí)API連接到Lua腳本引擎,通過(guò)編寫(xiě)Lua腳本,您可以對(duì)系統(tǒng)產(chǎn)生強(qiáng)大的影響。

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

Hammerspoon for Mac功能介紹

你好,世界

所有優(yōu)秀的編程教程都以某種類(lèi)型的Hello World示例開(kāi)頭,因此我們將使用Hammerspoon綁定鍵盤(pán)熱鍵來(lái)演示通過(guò)簡(jiǎn)單通知說(shuō)出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ù)綁定到特定的熱鍵。熱鍵是通過(guò)修飾鍵的表(指定?,?并且ctrl在這種情況下)和正常鍵(W)。匿名函數(shù)只是一個(gè)沒(méi)有名稱(chēng)的函數(shù)。我們可以使用名稱(chēng)單獨(dú)定義警報(bào)功能并將該名稱(chēng)傳遞給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)

窗戶(hù)運(yùn)動(dòng)簡(jiǎn)介

使用Hammerspoon可以做的最直接有用的事情之一是操縱屏幕上的窗口。我們將從一個(gè)簡(jiǎn)單的例子開(kāi)始,并構(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)語(yǔ)法

您可能已經(jīng)注意到,有時(shí)我們?cè)诤瘮?shù)調(diào)用中使用點(diǎn),有時(shí)我們使用冒號(hào)。冒號(hào)語(yǔ)法意味著您正在調(diào)用該對(duì)象的方法之一。它仍然是一個(gè)函數(shù)調(diào)用,但它隱式地將對(duì)象作為self參數(shù)傳遞給方法。

快速關(guān)注可變生命周期

Lua使用垃圾收集來(lái)清理其內(nèi)存使用情況 - 它認(rèn)為不再使用的任何對(duì)象將在未來(lái)的某個(gè)時(shí)刻被銷(xiāo)毀(確切地說(shuō),何時(shí),可能非常不可預(yù)測(cè),但它基于您的Lua代碼的活躍程度) 。

這意味著一旦函數(shù)/循環(huán)執(zhí)行完畢,只存在于函數(shù)/ loop / etc中的變量將可用于垃圾收集。這包括您的init.lua,它被認(rèn)為是在最后一行代碼運(yùn)行時(shí)完成的單個(gè)范圍。

如果您在自己中創(chuàng)建任何對(duì)象init.lua,則必須在變量中捕獲它們,否則將來(lái)會(huì)在某些時(shí)候以靜默方式銷(xiāo)毀它們。例如:

hs.pathwatcher.new(.....):start()

此處返回的對(duì)象(一個(gè)hs.pathwatcher對(duì)象)未被捕獲,因此只要init.lua完成,它就可用于垃圾收集。它可能不會(huì)在幾分鐘/幾小時(shí)后被銷(xiāo)毀,但是你會(huì)感到困惑,為什么你的pathwatcher沒(méi)有運(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)建的變量將立即變得不可訪問(wèn),因?yàn)樗鼈兊姆秶殃P(guān)閉。

更復(fù)雜的窗口移動(dòng)

我們可以在簡(jiǎn)單的窗口移動(dòng)示例的基礎(chǔ)上構(gòu)建一組鍵盤(pán)快捷鍵,允許我們使用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)窗口的常見(jiàn)窗口管理功能,使其占據(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è)問(wèn)題,我們將添加一個(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)在是否可以為自己編寫(xiě)功能,將上/下光標(biāo)鍵綁定到分別調(diào)整窗口的上半部/下半部分。

多窗口布局

當(dāng)您想要保持多個(gè)應(yīng)用程序一直打開(kāi),并以特定方式安排其窗口時(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è)問(wèn)題,我們首先在Mac上創(chuàng)建一個(gè)帶有主屏幕名稱(chēng)的變量。您可以:name()在hs.screen對(duì)象上使用該方法找到這些名稱(chēng)(例如hs.screen.allScreens()[1]:name(),在Hammerspoon控制臺(tái)中鍵入)。

然后,我們創(chuàng)建一個(gè)描述所需布局的表。表中的每個(gè)條目windowLayout都是另一個(gè)表,它選擇我們感興趣的窗口,并指定它們所需的位置和大小。

表格中的第一項(xiàng)是我們希望影響的應(yīng)用程序的名稱(chēng),第二項(xiàng)是我們希望影響的窗口的標(biāo)題。這些項(xiàng)目中的任何一項(xiàng)都可以nil,但不能兩者兼而有之。如果應(yīng)用程序名稱(chē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)目類(lèi)似于第五個(gè)項(xiàng)目,但它確實(shí)考慮了操作系統(tǒng)菜單欄和??俊_@在上面的示例中顯示,它將iTunes Mini Player窗口置于屏幕的最左下方,即使底座在那里也是如此。請(qǐng)注意,我們使用hs.geometry.rect()輔助函數(shù)來(lái)構(gòu)造rect表,并且y值為負(fù),這意味著窗口的頂部應(yīng)該在顯示屏底部上方48像素處開(kāi)始。

這可能看起來(lái)是一組相當(dāng)復(fù)雜的選項(xiàng),但是值得花一些時(shí)間學(xué)習(xí),因?yàn)樗试S非常強(qiáng)大的窗口布局,特別是對(duì)系統(tǒng)事件的反應(yīng)(例如插入監(jiān)視器時(shí)屏幕數(shù)量的變化,或者甚至只需按一個(gè)特定的熱鍵即可恢復(fù)窗戶(hù)的健康狀況。

窗口過(guò)濾器

在某些上下文或應(yīng)用程序中綁定熱鍵而不是其他熱鍵不是很有用嗎?組織窗口并根據(jù)位置,大小,工作流程或其任何組合對(duì)事件做出反應(yīng)?極其通用的hs.window.filter模塊允許您使用過(guò)濾規(guī)則和事件監(jiān)視器創(chuàng)建復(fù)雜的窗口分組和行為。展示該模塊功能的最佳方式是通過(guò)示例。

將內(nèi)容從Safari復(fù)制并粘貼到Messages.app時(shí),所有鏈接都在不斷擴(kuò)展,使文本難以閱讀:

Thrushes make up the Turdidae, a family of passerine birds that occurs worldwide.

只有Safari / Messages對(duì)受此影響,而其他OS X應(yīng)用程序通常會(huì)毫發(fā)意外地復(fù)制和粘貼。在窗口過(guò)濾器的幫助下,這種煩惱得到了徹底的糾正:

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ù)類(lèi)型后,該函數(shù)用純文本替換粘貼板上的Safari“富文本”。這確保了從Safari復(fù)制和粘貼圖像仍然有效。false默認(rèn)情況下,通過(guò)初始化來(lái)創(chuàng)建空窗口過(guò)濾器以排除所有窗口。添加了消息'appfilter',以便此窗口過(guò)濾器僅觀察消息窗口。然后我們訂閱windowfilter,以便cleanPasteboard每次Message窗口獲得焦點(diǎn)時(shí)都會(huì)調(diào)用它。當(dāng)某些窗口或應(yīng)用程序具有焦點(diǎn)時(shí),您可以類(lèi)似地啟用/禁用自定義熱鍵。

Windowfilters是動(dòng)態(tài)的,根據(jù)約束集在后臺(tái)自動(dòng)過(guò)濾。通過(guò)使用謂詞函數(shù)初始化windowfilter,您可以創(chuàng)建任意復(fù)雜的過(guò)濾規(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)

此窗口過(guò)濾器包含所有標(biāo)準(zhǔn)(非隱藏,非模態(tài))窗口,這些窗口共享當(dāng)前聚焦窗口的應(yīng)用程序和屏幕。窗口過(guò)濾器不斷更新,以便當(dāng)前聚焦的窗口確定正在播放的窗口組。這可用于使用hs.window.switcher或您自己的自定義循環(huán)器在當(dāng)前屏幕上循環(huán)使用聚焦的應(yīng)用程序窗口。

簡(jiǎn)單的配置重新加載

您可能已經(jīng)注意到,在編輯配置時(shí),Reload Config每次進(jìn)行更改時(shí)都必須繼續(xù)選擇菜單項(xiàng),這有點(diǎn)煩人。我們可以通過(guò)添加鍵盤(pán)快捷鍵來(lái)重新加載配置來(lái)解決這個(gè)問(wèn)題:

hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()

hs.reload()

end)

hs.alert.show("Config loaded")

我們現(xiàn)在將?+ ?+ ?+ 綁定R到一個(gè)函數(shù),該函數(shù)將重新加載配置并在屏幕上顯示一個(gè)簡(jiǎn)單的警報(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它允許我們?cè)谖募臅r(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ù)來(lái)調(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()路徑觀察器對(duì)象,因此它開(kāi)始工作。

在這個(gè)例子中,我們將配置重新加載函數(shù)實(shí)現(xiàn)為一個(gè)單獨(dú)的命名函數(shù),我們將其作為參數(shù)傳遞給hs.pathwatcher.new()。無(wú)論是傳遞命名函數(shù)還是在線使用匿名函數(shù),完全取決于您。

此函數(shù)接受單個(gè)參數(shù),該參數(shù)是包含已修改的文件的所有名稱(chēng)的表。它迭代該列表并檢查每個(gè)文件以查看它是否以.lua。如果任何Lua文件已被更改,它會(huì)告訴Hammerspoon銷(xiāo)毀當(dāng)前的Lua設(shè)置并重新加載其配置文件。

使用Spoons重新加載智能配置

Hammerspoon支持Lua插件,我們稱(chēng)之為“Spoons”。它們?cè)试S任何人使用Hammerspoon的API構(gòu)建有用的功能,然后將其分發(fā)給其他人。

由于配置重新加載是許多用戶(hù)可能想要的東西,因此它是Spoon的理想候選者,并且在此處的官方Spoons存儲(chǔ)庫(kù)中存在一個(gè)。

首先,單擊Spoon網(wǎng)頁(yè)上的“下載”鏈接 - 這應(yīng)該下載Zip文件并將其解壓縮到您的Downloads文件夾,在該文件夾中將顯示一個(gè)勺子圖標(biāo)。打開(kāi)該文件,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交互,這不是理想的,但通常需要完成某些事情。

為了說(shuō)明這一點(diǎn),我們將構(gòu)建一個(gè)熱鍵,在多個(gè)用戶(hù)代理字符串之間循環(huán)Safari(即它如何向Web服務(wù)器標(biāo)識(shí)自己)。要做到這一點(diǎn),你需要有Safari瀏覽器Develop啟用菜單,您可以通過(guò)勾選做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)

我們?cè)谶@里做的是首先啟動(dòng)Safari或?qū)⑵鋷У角懊妫ㄈ绻呀?jīng)運(yùn)行)。這是任何菜單交互中的重要步驟 - 通常會(huì)禁用當(dāng)前未關(guān)注的應(yīng)用程序的菜單。

然后我們使用了對(duì)Safari本身的引用hs.appfinder.appFromName()。使用此對(duì)象,我們可以搜索可用的菜單項(xiàng)并與它們進(jìn)行交互。具體來(lái)說(shuō),我們正在尋找三個(gè)用戶(hù)代理字符串的當(dāng)前狀態(tài)Develop→User Agent。然后我們檢查它們中的哪一個(gè)被勾選,然后選擇下一個(gè)。

因此,反復(fù)按?+ ?+ ?+ 7將在默認(rèn)用戶(hù)代理字符串,IE10用戶(hù)代理和Chrome用戶(hù)代理之間循環(huán)。每次,我們都會(huì)顯示一個(gè)簡(jiǎn)單的屏幕警報(bào),其中包含我們已循環(huán)訪問(wèn)的用戶(hù)代理的名稱(chēng)。

創(chuàng)建一個(gè)簡(jiǎn)單的菜單欄項(xiàng)目

許多Mac實(shí)用程序在系統(tǒng)菜單欄中放置一個(gè)小圖標(biāo)來(lái)顯示其狀態(tài)并讓您與它們進(jìn)行交互。我們將使用兩個(gè)Hammerspoon的擴(kuò)展來(lái)為流行的實(shí)用程序添加一個(gè)非常簡(jiǎn)單的替代品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)而不是文本,方法是在您的菜單欄對(duì)象中放置小圖像文件~/.hammerspoon/并使用該:setIcon()方法。有關(guān)此內(nèi)容hs.menubar的詳細(xì)信息,請(qǐng)參閱完整的API文檔。

對(duì)應(yīng)用程序事件做出反應(yīng)

使用hs.application.watcher回調(diào),我們可以對(duì)各種應(yīng)用程序級(jí)事件做出反應(yīng),例如正在啟動(dòng),退出,隱藏和激活的應(yīng)用程序。

我們可以通過(guò)創(chuàng)建一個(gè)非常簡(jiǎn)單的回調(diào)來(lái)證明這一點(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ù)的事件類(lèi)型是否是一個(gè)被激活的應(yīng)用程序。然后我們檢查被激活的應(yīng)用程序是否是Finder。如果是,我們選擇其菜單項(xiàng)將其所有窗口都放在前面。

然后,我們創(chuàng)建一個(gè)應(yīng)用程序觀察器對(duì)象,它將調(diào)用我們的函數(shù),并告訴它啟動(dòng)。

請(qǐng)注意,我們保留了對(duì)watcher對(duì)象的引用,而不是簡(jiǎn)單地調(diào)用hs.application.watcher.new(applicationWatcher):start()。這樣做的原因是,:stop()如果我們需要,我們可以稍后調(diào)用觀察者(例如,在重新加載我們的配置的函數(shù)中 - 有關(guān)如何自動(dòng)重新加載Hammerspoon配置的信息,請(qǐng)參閱Fancy Config Reloading示例)。

對(duì)wifi事件做出反應(yīng)

如果你使用MacBook,那么你家里可能有一個(gè)WiFi網(wǎng)絡(luò)。Hammerspoon在您到家并加入您的WiFi網(wǎng)絡(luò),或離家出走并離開(kāi)網(wǎng)絡(luò)時(shí)觸發(fā)事件非常簡(jiǎn)單。在這種情況下,我們將做一些簡(jiǎn)單的事情并調(diào)整MacBook的音量,使其在您離家時(shí)為零(保護(hù)您免受在咖啡店打開(kāi)MacBook并肆無(wú)忌憚地播放音樂(lè)的恥辱感)在家里玩?。?/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ò)的名稱(chēng)與之前網(wǎng)絡(luò)的名稱(chēng)進(jìn)行比較,并檢查我們是否已從預(yù)定義的家庭網(wǎng)絡(luò)遷移到其他地方,反之亦然,然后用于hs.audiodevice調(diào)整系統(tǒng)容量。

對(duì)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)然是無(wú)稽之談。

幸運(yùn)的是,我們可以通過(guò)發(fā)出虛假鍵盤(pán)事件來(lái)鍵入剪貼板內(nèi)容來(lái)繞過(guò)它們的損壞:

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)用程序通過(guò)AppleScript公開(kāi)它們的功能,Hammerspoon可以為您執(zhí)行:

ok,result = hs.applescript('tell Application "iTunes" to artist of the current track as string')

hs.alert.show(result)

這將要求iTunes詢(xún)問(wèn)當(dāng)前正在播放的曲目的藝術(shù)家,然后使用在屏幕上顯示該曲目hs.alert。

但是,在您急于開(kāi)始編寫(xiě)大量與iTunes相關(guān)的AppleScript之前,請(qǐng)查看本指南中的下一個(gè)條目。

控制iTunes / Spotify

使用hs.itunes和hs.spotify我們可以查詢(xún)/控制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)并沒(méi)有幫助你發(fā)現(xiàn)它。幸運(yùn)的是,我們可以查詢(xú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)

目前支持幾種不同類(lèi)型的繪圖對(duì)象 - 線條,圓形,方框,文本和圖像。不同的圖紙類(lèi)型可以具有不同的屬性,這些屬性都在API文檔中完整記錄。

繪圖對(duì)象可以放在所有其他窗口的頂部,也可以放在桌面圖標(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()

正如您無(wú)疑注意到的,只要您的Mac到達(dá)您最喜愛(ài)的時(shí)尚咖啡店,這將向人們發(fā)送兩條消息。您需要配置OS X的消息應(yīng)用程序,并且可以發(fā)送iMessage和SMS(后者通過(guò)使用SMS Relay的iPhone)來(lái)實(shí)現(xiàn)此功能。

使用URL自動(dòng)化Hammerspoon

有時(shí)您需要自動(dòng)化自動(dòng)化工具,而Hammerspoon可以通過(guò)多種方式實(shí)現(xiàn)自動(dòng)化。我們?cè)谶@里介紹的第一種方式是使用URL。特別是,以hammerspoon://。開(kāi)頭的網(wǎng)址。鑒于這個(gè)簡(jiǎn)單的片段:

hs.urlevent.bind("someAlert", function(eventName, params)

hs.alert.show("Received someAlert")

end)

我們現(xiàn)在為一個(gè)名為的事件綁定了一個(gè)URL事件處理程序,該事件someAlert將顯示一些屏幕上的文本警報(bào)。要在終端中觸發(fā)此事件,請(qǐng)運(yùn)行open -g hammerspoon://someAlert。許多應(yīng)用程序都能夠打開(kāi)URL,因此這成為自動(dòng)化Hammerspoon采取某些行動(dòng)的一種非常簡(jiǎn)單的方法。有關(guān)此更具體(和復(fù)雜)的示例,請(qǐng)參閱下一節(jié)。請(qǐng)注意,該-g選項(xiàng)open會(huì)導(dǎo)致URL在后臺(tái)打開(kāi),以避免打開(kāi)Hammerspoon的控制臺(tái)窗口,或者讓它為鍵盤(pán)焦點(diǎn)。

具有Karabiner和URL的Hammerspoon的高級(jí)自動(dòng)化

注意:Karabiner目前不在macOS Sierra中工作。它的作者正在研究一個(gè)新版本。

在我們的第一個(gè)例子中,我們?cè)?jīng)hs.hotkey將鍵盤(pán)快捷鍵綁定到Lua函數(shù),這是Hammerspoon可以做的最有用的事情之一。但是,這些熱鍵是在OS X中使用Carbon API執(zhí)行的,這在理解鍵盤(pán)事件方面是相當(dāng)高的 - 例如,它無(wú)法區(qū)分?按下哪個(gè)鍵(因?yàn)橛袃蓚€(gè),一個(gè)在鍵盤(pán)左側(cè),右側(cè)一個(gè)),也不能綁定涉及Fn鍵的熱鍵。

一個(gè)能夠以非常低的水平理解這些鍵盤(pán)事件的應(yīng)用程序是Karabiner,它連接到OS X內(nèi)核以讀取來(lái)自鍵盤(pán)的原始事件。通常它用于將這些鍵事件重新映射到其他鍵事件(即更改鍵盤(pán)上鍵的行為),但是,它也可以將低級(jí)鍵事件轉(zhuǎn)換為更高級(jí)別的系統(tǒng)操作,例如執(zhí)行終端命令,或者打開(kāi)一個(gè)URL。

因此,我們可以結(jié)合Karabiner和Hammerspoon來(lái)執(zhí)行一些非常強(qiáng)大和靈活的熱鍵綁定。在這個(gè)例子中,我們將把一些鍵盤(pán)修飾符從鍵盤(pán)的右側(cè)綁定到Hammerspoon中的Lua函數(shù)。

首先,安裝Karabiner并打開(kāi)其配置應(yīng)用程序在Misc & Uninstall選項(xiàng)卡中,單擊Open private.xml。這將顯示一個(gè)Finder窗口,顯示一個(gè)名為的文件private.xml。右鍵單擊該文件并選擇Open With → TextEdit.app。您現(xiàn)在將看到TextEdit打開(kāi),顯示XML文檔。如果您之前從未使用過(guò)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)包含任何空格開(kāi)頭。該選項(xiàng)意味著Karabiner將在不激活Hammerspoon的情況下打開(kāi)URL。幾乎沒(méi)有理由想要將焦點(diǎn)轉(zhuǎn)移到Hammerspoon,因此建議您始終使用此選項(xiàng)。

將URL定義為虛擬鍵碼后,我們告訴Karabiner聽(tīng)右手?,右手?和→光標(biāo)鍵。如果按下這些鍵,它將打開(kāi)URL hammerspoon://test1?someParam=hello。

保存private.xml文檔并關(guān)閉TextEdit?,F(xiàn)在,在Karabiner中,切換回Change Key選項(xiàng)卡并單擊Reload XML。假設(shè)您沒(méi)有收到任何錯(cuò)誤,請(qǐng)勾選旁邊的框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 做了些什么?

菜單欄顯示最近幾天天氣情況

· 請(qǐng)求免費(fèi)的天氣 API,在深圳這個(gè)多雨的城市里提醒我別忘記帶傘。

· 剪切板歷史記錄

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

· 音量調(diào)節(jié)快捷鍵

· 當(dāng)我使用外接鍵盤(pán)時(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)斷開(kāi)連接的藍(lán)牙耳機(jī),參考我的另一篇介紹。

· 輸入法自動(dòng)切換

· 在每個(gè) App 界面自動(dòng)切換成

搜狗輸入法

,配合搜狗輸入法自動(dòng)中英文切換,再也不用在系統(tǒng)默認(rèn)的英文輸入法和搜狗輸入法之間來(lái)回切換了。

· 定時(shí)自動(dòng)提交代碼

· 使用 

hs.timer

 定時(shí)器,定時(shí)自動(dòng)推送我的筆記和下載的電子書(shū)到 Github 倉(cāng)庫(kù)。

· USB 設(shè)備連接記錄

· 記錄插上你電腦的每一個(gè) USB 設(shè)備信息,凡插過(guò)必留記錄。

· 消息推送

· 推送任意消息提醒

· TTS 發(fā)聲

· 調(diào)用 

say hello world

 合成 TTS,模擬真人發(fā)音,讓 Mac 會(huì)說(shuō)話。

· 更多... (完全停不下來(lái)啊)

其他插件思路

· 番茄鐘

· 應(yīng)用搜索

· 桌面小部件

小編的話

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

載地址

下載錯(cuò)誤?【投訴報(bào)錯(cuò)】

Hammerspoon for Mac(OS X桌面自動(dòng)化神器) v0.9.95 蘋(píng)果電腦版

      氣軟件

      關(guān)文章

      載聲明

      ☉ 解壓密碼:www.dbjr.com.cn 就是本站主域名,希望大家看清楚,[ 分享碼的獲取方法 ]可以參考這篇文章
      ☉ 推薦使用 [ 迅雷 ] 下載,使用 [ WinRAR v5 ] 以上版本解壓本站軟件。
      ☉ 如果這個(gè)軟件總是不能下載的請(qǐng)?jiān)谠u(píng)論中留言,我們會(huì)盡快修復(fù),謝謝!
      ☉ 下載本站資源,如果服務(wù)器暫不能下載請(qǐng)過(guò)一段時(shí)間重試!或者多試試幾個(gè)下載地址
      ☉ 如果遇到什么問(wèn)題,請(qǐng)?jiān)u論留言,我們定會(huì)解決問(wèn)題,謝謝大家支持!
      ☉ 本站提供的一些商業(yè)軟件是供學(xué)習(xí)研究之用,如用于商業(yè)用途,請(qǐng)購(gòu)買(mǎi)正版。
      ☉ 本站提供的Hammerspoon for Mac(OS X桌面自動(dòng)化神器) v0.9.95 蘋(píng)果電腦版資源來(lái)源互聯(lián)網(wǎng),版權(quán)歸該下載資源的合法擁有者所有。