项目标题与描述
Hammerspoon 是一款用于 macOS 的强大自动化工具。其核心是一个连接操作系统和 Lua 脚本引擎的桥梁,通过一系列扩展模块暴露系统 API 给用户,让您能够编写 Lua 脚本来控制 macOS 环境的各个方面。
项目主要特点:
基于 Mjolnir 项目开发,提供更集成的体验
通过扩展模块覆盖广泛的系统 API
支持纯 Lua 插件(Spoons)系统
活跃的社区支持和丰富的文档资源
功能特性
核心功能
系统自动化控制:通过 Lua 脚本控制 macOS 的各种功能
窗口管理:管理窗口位置、大小和布局
应用控制:启动、切换和监控应用程序
文件系统操作:文件和目录管理功能
网络请求:HTTP/HTTPS 客户端功能
事件监听:监控系统事件如电池状态、网络变化等
UI 创建:构建自定义菜单栏项和界面元素
独特价值
高度可定制:完全通过 Lua 脚本配置,灵活性强
模块化设计:通过扩展模块按需加载功能
社区支持:活跃的 IRC 频道和 Google 群组
跨版本兼容:支持多种 macOS 版本
安装指南
手动安装
下载最新版本
将 Hammerspoon.app
从下载文件夹拖到应用程序文件夹
通过 Homebrew 安装
brew install hammerspoon --cask
系统要求
macOS 10.10 或更高版本
需要启用辅助功能权限
使用说明
基本配置
Hammerspoon 安装后默认不执行任何操作,您需要创建 ~/.hammerspoon/init.lua
文件并添加功能代码。
示例基础配置:
-- 绑定快捷键重新加载配置
hs.hotkey.bind({
"cmd", "alt", "ctrl"}, "R", function()
hs.reload()
end)
-- 显示欢迎信息
hs.alert.show("Hammerspoon 已加载")
窗口管理示例
-- 将窗口移动到屏幕左侧半屏
hs.hotkey.bind({
"cmd", "alt"}, "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)
HTTP 请求示例
-- 发起 GET 请求
hs.http.asyncGet("https://api.example.com/data", nil, function(status, body, headers)
if status == 200 then
hs.alert.show("获取数据成功")
print(body)
else
hs.alert.show("请求失败: "..status)
end
end)
核心代码
事件监听实现
-- 监听电池状态变化
local batteryWatcher = hs.battery.watcher.new(function()
local percentage = hs.battery.percentage()
if percentage <= 20 then
hs.alert.show("电池电量低: "..percentage.."%")
end
end)
batteryWatcher:start()
自定义菜单栏项
-- 创建菜单栏时钟
local menuBar = hs.menubar.new()
function updateTime()
menuBar:setTitle(os.date("%H:%M"))
end
timer = hs.timer.new(60, updateTime)
updateTime()
timer:start()
窗口管理核心逻辑
-- 窗口管理模块核心函数
function moveWindowToPosition(position)
local win = hs.window.focusedWindow()
local screen = win:screen()
local max = screen:frame()
local f = win:frame()
if position == "left" then
f.x = max.x
f.y = max.y
f.w = max.w / 2
f.h = max.h
elseif position == "right" then
f.x = max.x + (max.w / 2)
f.y = max.y
f.w = max.w / 2
f.h = max.h
end
win:setFrame(f)
end
更多精彩内容 请已关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码
暂无评论内容