Hammerspoon - Mac下非常好用的快捷键配置工具

AI 摘要: 文章介绍了作者在购买了高频AI Chatbox后,发现Hammerspoon这款可以用代码控制Mac的工具,满足了他快速切换不同App的需求。Hammerspoon通过Lua脚本来控制和自动化Mac,在配置全局快捷键、延迟按键设置等方面提供了实用功能。同时还提到了Alfred等其他提升效率的MacOS软件,认为开源免费的Hammerspoon很符合自己的需求。

1. 背景

M4 更换后,被 EZ 大佬安利购买了ChatWise Chatbox(以前一直使用的是开源的NextChat),因为高频的AI Chatbox需要,所以时常会在不同 App 之间快速切换。

在没有 Hammerspoon 之前,需要通过CMD+Tab在不同 App 之间进行切换,以前也花钱购买过另一款 MacOS 软件产品Command-Tab Plus(在之前关于 PopclipExtendsion 扩展软件开发那篇文章有简要介绍),效果都不尽人意。

想着能否有一种Hash快捷键方式,而非通过 Cmd+tabRange遍历方式唤起不同的 App,调研下来发现Hammerspoon完美符合自己诉求。

2. Hammerspoon 介绍

Hammerspoon:macOS 自动化与效率提升的瑞士军刀

https://www.hammerspoon.org/

Hammerspoon 的核心理念是“用代码控制你的 Mac”,它不是一个图形化的自动化工具,而是基于脚本的。

Hammerspoon 通过将 macOS 的核心功能暴露给 Lua 脚本,让用户能够以前所未有的方式控制和自动化他们的 Mac。你可以将其理解为一个将 macOS 的各种 API 封装成易于使用的 Lua 模块的框架,从而让非专业的开发者也能轻松地编写脚本来完成各种自动化任务。

2.1. 工作原理

  1. 监听系统事件: Hammerspoon 运行在后台,持续监听 macOS 的各种系统事件,例如按键按下、鼠标移动、窗口变化、应用程序启动/退出、网络状态改变等等。
  2. 执行 Lua 脚本: 当检测到特定的系统事件时,Hammerspoon 会触发相应的 Lua 脚本。
  3. 调用 macOS API: Lua 脚本通过 Hammerspoon 提供的模块,调用底层的 macOS API,从而实现对系统的控制和操作。

2.2. 主要功能和应用场景

快捷键绑定

  • 全局快捷键: 定义系统范围的快捷键,用于启动应用程序、执行脚本、控制系统功能等。
  • 应用程序特定快捷键: 为不同的应用程序设置不同的快捷键。
  • 组合键与修饰键: 支持各种复杂的组合键和修饰键。

下面就是我自己最简单的几个快捷键配置,分别使用alt+r唤起Chatwisealt+b唤起Notionalt+f唤起Chrome

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
local function openApp(appName)
    local app = hs.application.get(appName)
    if not app then
        hs.application.launchOrFocus(appName)
    else
        app:activate()
    end
end

-- alt+ a - z
hs.hotkey.bind({'alt'}, 'r', function() openApp("Chatwise") end)
hs.hotkey.bind({'alt'}, 'b', function() openApp("Notion") end)
hs.hotkey.bind({'alt'}, 'f', function() openApp("Google Chrome") end)

-- f1 - f12
hs.hotkey.bind({'alt'}, 'f2', function() openApp("iTerm") end)

2.3. 其他功能

窗口管理:

  • 自定义窗口布局: 通过快捷键或脚本快速调整窗口大小和位置,实现分屏、网格布局等。
  • 窗口聚焦与切换: 快速切换到特定应用程序的窗口,或者根据规则自动聚焦窗口。
  • 窗口透明度与层级控制: 调整窗口的透明度,或者将窗口置顶。
  • 快捷键绑定:
    • 全局快捷键: 定义系统范围的快捷键,用于启动应用程序、执行脚本、控制系统功能等。
    • 应用程序特定快捷键: 为不同的应用程序设置不同的快捷键。
    • 组合键与修饰键: 支持各种复杂的组合键和修饰键。
  • 应用程序控制:
    • 启动、退出、隐藏应用程序: 通过脚本控制应用程序的生命周期。
    • 发送按键和鼠标事件: 模拟用户操作,自动化应用程序内的任务。
    • 获取应用程序信息: 获取当前活动应用程序、窗口标题等信息。
  • 系统状态监控与控制:
    • 网络状态监控: 检测网络连接状态,根据网络变化执行脚本。
    • 电池状态监控: 根据电池电量执行脚本,例如低电量提醒。
    • 音量控制: 通过快捷键或脚本调整系统音量。
    • 屏幕亮度控制: 通过快捷键或脚本调整屏幕亮度。
    • 蓝牙设备管理: 连接、断开蓝牙设备。
  • 剪贴板管理:
    • 剪贴板历史记录: 记录剪贴板内容,方便查找和粘贴。
    • 剪贴板内容处理: 对剪贴板内容进行格式化、转换等操作。
  • 通知与提醒:
    • 发送系统通知: 通过脚本发送自定义的系统通知。
    • 定时提醒: 设置定时任务,执行脚本或发送提醒。
  • 文件系统操作:
    • 文件和文件夹操作: 创建、删除、移动、复制文件和文件夹。
    • 文件内容读取与写入: 读取和写入文件内容。
  • 外部设备控制:
    • USB 设备检测: 检测 USB 设备的插入和拔出。
    • 显示器管理: 控制显示器的分辨率、排列方式等。
  • 自定义菜单栏图标:
    • 在菜单栏显示自定义信息: 例如网络速度、CPU 使用率等。
    • 通过菜单栏图标执行脚本: 点击菜单栏图标触发脚本。

其他功能 Lua 示例(需要测试)

因为一些其他功能暂时用不到,就不一一列举里,下面是一些 Case 参考(具体还需要调试)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- 启动/切换应用:
hs.hotkey.bind({"alt"}, "f1", function()
    hs.application.launchOrFocus("iTerm")
end)

-- 执行任意命令
hs.hotkey.bind({"ctrl", "cmd"}, "T", function()
    hs.execute("/usr/local/bin/curl example.com") -- 执行终端命令
end)

-- 窗口管理,将窗口移动到左半屏
hs.hotkey.bind({"ctrl", "alt"}, "left", function()
    local win = hs.window.focusedWindow()
    win:moveToUnit({0, 0, 0.5, 1}) -- {x, y, w, h}
end)


-- 跨应用操,自动填写表单(模拟按键)
hs.hotkey.bind({"cmd"}, "F2", function()
    hs.eventtap.keyStrokes("admin@example.com") -- 输入文本
    hs.eventtap.keyStroke({}, "tab") -- 按 Tab 键
end)

-- 网络请求
hs.http.asyncGet("https://api.example.com", nil, function(status, data)
    if status == 200 then
        hs.alert.show("数据已获取")
    end
end)

3. 补充 1:关于在 Mac 下使用左 Shift 切换输入法的问题补充说明

3.1. Mac Keyboard 配置

由于受到多年 Sogou 输入法的影响,形成了左小拇指的 Shift 切换输入法,导致后面切换回苹果原生输入法后,需要 TAB 按键切换非常不适应。

所以很早以前就该用了Karbiner-Elements来实现,简言之就是先通过 Mac 的输入法系统设置,设置一个极冷门快捷(防止误触发,比如RightCommand+RightOption+F1)在中英文之间切换。

mac keyboard系统设置

3.2. Karbinner软件做按键修改

Karbinner按键修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "description": "Change L_Shift to right_command+right_option+f1 to switch EN/ZH",
  "manipulators": [
    {
      "from": {
        "key_code": "left_shift",
        "modifiers": { "optional": ["any"] }
      },
      "to": [
        {
          "key_code": "left_shift",
          "lazy": true
        }
      ],
      "to_if_alone": [
        {
          "key_code": "f1",
          "modifiers": ["right_command", "right_option"]
        }
      ],
      "type": "basic"
    }
  ]
}

3.3. 延迟按键设置

注意下配置按键和延迟时间,一般我们切换输入法是快速按下 Shift 按键,而使用字母大小写切换则会通过长按 Shift,这点目前还没有使用HS替换,如果可以的话,那么KB就可以不用了!

延迟按键

4. 补充 2: 借助 Alfred 实现软件唤起

Alfred 也是一款非常牛皮的 MacOS 软件,也可以简单的使用关键字唤起,同时也支持很多提升效率的方式可以挖掘,PS. 一次性付费的

Alfred唤起软件

5. 补充 3: 借助 PopClip 唤起

关于 PopClip 文章,可以看下之前的一篇文章小结: PopClip 扩展工具开发,PS. 是一次性付费的

PopClip唤起

6. 小结

MacOS 下的快捷键效率工具肯定还有很多其他类似的产品,目前就体验下来开源免费的HammerSpoon非常 Match 当前我的痛点。

另外,自己也分享了下每天工作使用到的几款 MacOS 产品进行了简要的分享(Hammerspoon、Karbiner、Alfred、PopClip),刚兴趣的也可以试试~

毕竟,每天高频重复的操作,每次能节省一点时间总归是开心的~