Hammerspoon 是一套基于 Lua 的 macOS 自动化框架:你可以用脚本把快捷键、窗口布局、应用启动、剪贴板、通知提示等动作串起来,做成“按一下就完成”的小工具。
它的定位介于系统自带自动化(快捷指令/Automator)与更重的脚本环境之间:上手快、可控性强,而且配置文件就是一份 init.lua,便于同步与版本管理。
工具地址:https://www.hammerspoon.org/ (源码与文档也可在 https://github.com/Hammerspoon/hammerspoon 找到)
方式 A:Homebrew 安装(推荐)
如果你已经安装了 Homebrew,可以用下面命令安装:
brew install --cask hammerspoon
方式 B:官网下载
也可以直接从官网下载安装包:https://www.hammerspoon.org/
首次启动常见权限
为了让快捷键与窗口控制生效,macOS 往往会提示你开启“辅助功能(Accessibility)”权限。若发现脚本不生效,优先检查:
系统设置 - 隐私与安全性 - 辅助功能
把 Hammerspoon 允许即可(不同系统版本名称略有差异)。
Hammerspoon 的配置入口是 ~/.hammerspoon/init.lua。如果目录不存在,手动创建即可。
先写一个“可验证”的最小脚本:绑定一个快捷键,按下后弹通知:
-- ~/.hammerspoon/init.lua -- 最小可用:绑定快捷键并提示 local hyper = {"cmd", "alt", "ctrl"} hs.hotkey.bind(hyper, "R", function() hs.notify.new({ ="Hammerspoon", informativeText="配置已加载"}):send() end)
保存后在 Hammerspoon 菜单里点 Reload Config,或者给自己也绑一个“自动 reload”的快捷键(后面会给示例)。
最常用的一类脚本就是窗口管理。下面示例用同一套“超键”把当前窗口快速移动到左/右/全屏/居中:
local hyper = {"cmd", "alt", "ctrl"} local function focusedWin() return hs.window.focusedWindow() end -- 左半屏 hs.hotkey.bind(hyper, "H", function() local win = focusedWin(); if not win then return end win:moveToUnit(hs.geometry.rect(0, 0, 0.5, 1)) end) -- 右半屏 hs.hotkey.bind(hyper, "L", function() local win = focusedWin(); if not win then return end win:moveToUnit(hs.geometry.rect(0.5, 0, 0.5, 1)) end) -- 全屏填充 hs.hotkey.bind(hyper, "F", function() local win = focusedWin(); if not win then return end win:moveToUnit(hs.geometry.rect(0, 0, 1, 1)) end) -- 居中(适合写作/终端) hs.hotkey.bind(hyper, "C", function() local win = focusedWin(); if not win then return end win:centerOnScreen() end)
如果你更喜欢“网格”方式(像 i3/Rectangle 那种感觉),可以直接启用内置 grid:
hs.grid.setGrid('6x4') -- 打开网格可视化操作 hs.hotkey.bind(hyper, "G", function() hs.grid.show() end)
另一个很实用的方向是“把固定流程做成一个按键”。例如:按一下打开浏览器、笔记与终端,并把窗口做基础布局。
先来一个简单的“快速启动器”:按键后聚焦或启动某个 App:
local hyper = {"cmd", "alt", "ctrl"} local function launch(name) hs.application.launchOrFocus(name) end hs.hotkey.bind(hyper, "B", function() launch("Google Chrome") end) hs.hotkey.bind(hyper, "T", function() launch("iTerm") end) hs.hotkey.bind(hyper, "N", function() launch("Obsidian") end)
再加一个“自动重载配置”的快捷键,修改脚本后不需要用鼠标点菜单:
hs.hotkey.bind(hyper, "R", function() hs.reload() hs.alert.show("Hammerspoon reloaded") end)
想进一步做窗口布局,可以结合 hs.screen / hs.window 在启动后延迟 200-500ms 再移动窗口,避免“应用还没创建窗口”导致失败。
1) 看 Console 报错:Hammerspoon 自带 Console,配置语法错误、模块找不到等都会在这里提示。遇到问题优先打开 Console 排查。
2) 权限没开:快捷键没反应、窗口移动失败,先检查“辅助功能(Accessibility)”。
3) 快捷键冲突:如果你的组合键被系统或其他 App 占用,Hammerspoon 也可能绑定失败。建议统一使用一个“超键”组合(例如 cmd+alt+ctrl),冲突更少。
4) 记得 reload:修改 init.lua 后,必须 reload 才会生效;建议绑定 reload 热键。
- 官网:https://www.hammerspoon.org/
- GitHub:https://github.com/Hammerspoon/hammerspoon
- API 文档:https://www.hammerspoon.org/docs/