Hammerspoon – 强大的 macOS 自动化工具

项目标题与描述

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智能小助手)
公众号二维码

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容