macOS 用 Hammerspoon 自定义快捷键与窗口布局:从安装到一份可复用配置

为什么用 Hammerspoon 做“可编程快捷键”

Hammerspoon 是一个把 macOS 的系统能力(窗口、应用、键盘、剪贴板、屏幕等)暴露给 Lua 脚本的自动化工具。它的优势在于:配置文件是纯文本、可版本管理;规则可以按你的习惯生长;很多“差一点就顺手”的小动作(比如把当前窗口一键半屏、把窗口丢到另一块屏幕、用统一快捷键唤起常用应用)都能稳定落地。

工具地址:https://www.hammerspoon.org/

安装方式(两选一)

方式 A(Homebrew,适合习惯命令行的用户):brew install --cask hammerspoon

方式 B(官网下载安装包):在上面的官网地址下载并安装。

首次运行与必须的权限设置

为了让快捷键与窗口操作生效,建议按下面顺序确认权限(不同系统版本的菜单名称略有差异):

1)辅助功能(Accessibility):系统设置 -> 隐私与安全性 -> 辅助功能,把 Hammerspoon 打开。

2)输入监控(Input Monitoring):如果你要监听全局按键,也需要在同一页把 Hammerspoon 勾选启用。

3)屏幕录制(可选):只有在你需要读取屏幕像素、截图或更复杂的屏幕交互时才需要。

权限改完后,建议完全退出并重新打开 Hammerspoon(菜单栏图标 -> Quit)。

配置文件位置与加载逻辑

Hammerspoon 默认读取:~/.hammerspoon/init.lua。你可以把所有配置写在一个文件里,也可以拆分成多个文件再 require 进来,方便维护。

每次你修改配置后,在菜单栏点击 Hammerspoon 图标,选择 Reload Config(或用你自己绑定的快捷键)即可热加载。

一份可直接复用的 init.lua 示例

下面这份示例做了三件事:统一的“超键”快捷键;常用应用一键唤起;窗口半屏/全屏/居中与跨屏移动。复制后按你的应用名微调即可。

-- ~/.hammerspoon/init.lua -- 1) 定义一个常用组合键(也有人叫 Hyper Key) local hyper = {"ctrl", "alt", "cmd"} -- 2) Reload 配置(改完马上生效) hs.hotkey.bind(hyper, "R", function() hs.reload() hs.alert.show("Hammerspoon reloaded") end) -- 3) 一键唤起常用应用(把名字改成你系统里的应用名) local function launch(appName) return function() hs.application.launchOrFocus(appName) end end hs.hotkey.bind(hyper, "T", launch("iTerm")) hs.hotkey.bind(hyper, "B", launch("Google Chrome")) hs.hotkey.bind(hyper, "S", launch("Slack")) -- 4) 窗口布局:左/右半屏、最大化、居中 local function win() return hs.window.focusedWindow() end local function frame() return win() and win():screen():frame() end hs.hotkey.bind(hyper, "H", function() local w = win(); if not w then return end local f = frame() w:setFrame({x=f.x, y=f.y, w=f.w/2, h=f.h}) end) hs.hotkey.bind(hyper, "L", function() local w = win(); if not w then return end local f = frame() w:setFrame({x=f.x+f.w/2, y=f.y, w=f.w/2, h=f.h}) end) hs.hotkey.bind(hyper, "M", function() local w = win(); if not w then return end w:maximize() end) hs.hotkey.bind(hyper, "C", function() local w = win(); if not w then return end local f = frame() local wf = w:frame() local nw, nh = math.floor(f.w*0.7), math.floor(f.h*0.8) w:setFrame({x=f.x+(f.w-nw)/2, y=f.y+(f.h-nh)/2, w=nw, h=nh}) end) -- 5) 跨显示器移动(适合外接屏办公) hs.hotkey.bind(hyper, "P", function() local w = win(); if not w then return end w:moveToScreen(w:screen():next()) end)

常见问题与排查清单

1)快捷键完全不生效:优先检查“辅助功能/输入监控”是否给了权限;改权限后要重启 Hammerspoon。

2)应用名不匹配:hs.application.launchOrFocus 依赖系统里的应用显示名。最简单的办法是把应用名改成 Finder 里看到的那个(例如“Google Chrome”“iTerm”)。

3)窗口设置后有偏移:多显示器和刘海屏会影响可用区域,建议用 screen():frame() 而不是 screen():fullFrame()。

进阶思路:把“个人工作流”做成模块

当你的配置变多以后,可以把“窗口布局”“应用启动”“快捷键映射”拆成多个 Lua 文件(例如 windows.lua、apps.lua),在 init.lua 中按需加载。这样你在不同机器之间同步配置时,也能更容易做差异化(比如家里一块屏、公司两块屏)。

参考链接

https://www.hammerspoon.org/docs/

用户评论 (0)

登录后参与讨论

立即登录 注册账号

暂无评论,快来抢沙发吧~

操作成功