hammerspoon mac版是一款简单而强大的macOS自动化工具,它为您提供了一个合适的环境,用于编写Lua代码脚本,用于设置可以使用全局热键组合触发的自动操作。简而言之,Hammerspoon将系统API桥接到一个简单的Lua脚本引擎,这意味着它使您能够编写Lua脚本以自动执行各种自动化任务。
原文链接:https://mac.orsoon.com/Mac/163637.html(附安装下载教程)
Hammerspoon Mac最新版软件介绍
Hammerspoon是OS X的桌面自动化工具。它将各种系统级API连接到Lua脚本引擎,通过编写Lua脚本,您可以对系统产生强大的影响。
这很简单的描述。您可以编写与应用程序,Windows,鼠标指针,文件系统对象,音频设备,电池,屏幕,低级键盘/鼠标事件,剪贴板,定位服务,WiFi等等的OS X API进行交互的Lua代码。通常,您将在Lua中编写一个将事件连接到操作的配置文件。您可能希望将键盘快捷键绑定到一系列窗口操作或applescript。当您的WiFi接口连接到家庭网络时,您可能需要运行一系列命令。当您的电池电量低于一定百分比时,您可能希望显示警报。你可能想做一些疯狂的事情,就像iTunes在Mac侦测到你在巴黎时自动开始播放的那样。
所有优秀的编程教程都以某种类型的Hello World示例开头,因此我们将使用Hammerspoon绑定键盘热键来演示通过简单通知说出Hello World。
在您的init.lua
位置以下:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.alert.show("Hello World!")
end)
然后保存文件,单击Hammerspoon菜单栏图标并选择Reload Config
。您现在应该发现按⌘+ ⌥+ ctrl+ W将在屏幕上显示Hello World通知。
这里发生的是我们告诉Hammerspoon将匿名函数绑定到特定的热键。热键是通过修饰键的表(指定⌘,⌥并且ctrl在这种情况下)和正常键(W)。匿名函数只是一个没有名称的函数。我们可以使用名称单独定义警报功能并将该名称传递给hs.hotkey.bind()
,但是Lua可以很容易地定义内联函数。
虽然hs.alert
很有用,但您可能更喜欢使用OS X本机通知,只需将上一个示例修改为:
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
hs.notify.new({title="Hammerspoon", informativeText="Hello World"}):send()
end)
使用Hammerspoon可以做的最直接有用的事情之一是操纵屏幕上的窗口。我们将从一个简单的例子开始,并构建一个更复杂的东西。
将以下内容添加到您的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)
这将导致⌘+ ⌥+ ctrl+ H使当前聚焦的窗口向左移动10个像素。您可以看到我们获取当前聚焦的窗口然后获取其帧。这描述了窗口的位置和大小。然后我们可以修改框架并使用它将其应用回窗口setFrame()
。
您可能已经注意到,有时我们在函数调用中使用点,有时我们使用冒号。冒号语法意味着您正在调用该对象的方法之一。它仍然是一个函数调用,但它隐式地将对象作为self
参数传递给方法。
Lua使用垃圾收集来清理其内存使用情况 - 它认为不再使用的任何对象将在未来的某个时刻被销毁(确切地说,何时,可能非常不可预测,但它基于您的Lua代码的活跃程度) 。
这意味着一旦函数/循环执行完毕,只存在于函数/ loop / etc中的变量将可用于垃圾收集。这包括您的init.lua
,它被认为是在最后一行代码运行时完成的单个范围。
如果您在自己中创建任何对象init.lua
,则必须在变量中捕获它们,否则将来会在某些时候以静默方式销毁它们。例如:
hs.pathwatcher.new(.....):start()
此处返回的对象(一个hs.pathwatcher
对象)未被捕获,因此只要init.lua完成,它就可用于垃圾收集。它可能不会在几分钟/几小时后被销毁,但是你会感到困惑,为什么你的pathwatcher没有运行。相反,这个版本将继续存在,直到您重新加载配置,或退出Hammerspoon:
myWatcher = hs.pathwatcher.new(.....):start()
该myWatcher
变量是一个全局变量,所以永远不会走出去的范围。
关于变量的生命周期 - 在Console窗口中,每次键入一行并按Enter键时,都会创建,执行和完成不同的Lua范围。这意味着local
当您按Enter键时,在控制台窗口中创建的变量将立即变得不可访问,因为它们的范围已关闭。
我们可以在简单的窗口移动示例的基础上构建一组键盘快捷键,允许我们使用nethack
移动键在所有方向上移动窗口:
y k u
h l
b j n
要做到这一点,我们只需要hs.hotkey.bind()
稍微不同的帧修改重复前一个调用:
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", "