dantifer
V2EX  ›  macOS

介绍一下我使用 karabiner 和 hammerspoon 的经验

  •  
  •   dantifer · 11h 47m ago · 1154 views

    有几个诉求:

    1. 能够在快速启动和切换 app
    2. 能够方便的把 app 移动到不同的显示器上
    3. 能够方便的调整 app 窗口的大小,比如全屏,等
    4. 其他杂七杂八的需求,比如调整音量,屏幕亮度,关屏之后自动关闭蓝牙等

    解决方案就是 karabiner 和 hammerspoon 。

    工作流:

    1. 使用 HyperKey + C ,就会自动打开 Chrome. 如果 Chrome 已经打开,就会切换到对应的窗口。
    2. 然后按 HyperKey + ], 就会把 Chrome 移动到下一个显示器上,然后再按 HyperKey + Enter, 就会在新显示器上全屏(非 macos 的全屏,只是调整窗口到全屏幕大小)显示 Chrome 。
    3. 如果想并排显示两个程序,就 HyperKey + ->, chrome 就只占据屏幕的右半边。另外一个程序,按 HyperKey + <-, 则它就会占据屏幕的左半边。

    =========

    Karabiner 的作用,是创建一个 hyper key. 我是把 caps lock 键,映射成了 control + option + command + shift. 所以按下 caps lock 键,就相当于触发了这四个键的组合。

    hammerspoon 的作用是根据快捷键,来做各种操作。目前配置了如下的快捷功能:

    HyperKey: {"cmd", "alt", "ctrl", "shift"}

    HyperKey + l: lock screen

    HyperKey + b: show battery status on screen

    HyperKey + [: move app to left screen

    HyperKey + ]: move app to right screen

    HyperKey + return: maximize current window

    HyperKey + left: resize current window to the left half of the screen

    HyperKey + right: resize current window to the right half of the screen

    HyperKey + up: resize current window to the top half of the screen

    HyperKey + down: resize current window to the bottom half of the screen

    HyperKey + x: launch application by x (see key2App in key-bindings.lua, you can customize it in your own way)

    {"CMD","Ctrl"} + up: volume up

    {"CMD","Ctrl"} + down: volume down

    {"option","Ctrl"} + up: screen brightness up

    {"option","Ctrl"} + down: screen brightness down

    =========

    github repos:

    https://github.com/zfdang/macos-softwares-and-tips

    https://github.com/zfdang/hammerspoon-config

    35 replies    2026-06-29 16:45:35 +08:00
    di11wei
        1
    di11wei  
       10h 56m ago via iPhone
    如果 Karabiner 只用来设置一个 hyperkey 是不是有点「太重了」呢。
    推荐用下 https://hyperkey.app/versions ,单纯的设置 hyperkey 的程序。
    gap
        2
    gap  
       10h 33m ago via iPhone
    我只用 hammerspoon ,hyperkey 是右 cmd
    dantifer
        3
    dantifer  
    OP
       9h 49m ago
    @di11wei 之前不知道 kyperkey 这个程序,一直使用 Karabiner, 也是免费的,就没有再换。
    以后可以试试 Hyperkey
    dantifer
        4
    dantifer  
    OP
       9h 48m ago
    @gap 右 cmd 最大的问题是,常用操作都得两只手才行,cap + 字母,很多时候左手就够了
    jheroy
        5
    jheroy  
       8h 52m ago via iPhone
    karabiner 本身就能做两种操作,不需要单独安 hammmerspoon 吧, 另外 karabiner 强的地方是可以吧键盘上任意键作为修饰键, 比如我是按住 o 不放再按 q 就是打开 QQ ,单击 o 还是输出 o 。 按住 w 不放再按 hjkl 是移动窗口位置, 按住 r 加 hjkl 是改变窗口大小等等。karabiner 本身的配置有点繁琐,推荐一个生成配置的工具:GokuRakuJoudo 可以通过一个简化配置直接生成 karabiner 的配置。
    gpt5
        6
    gpt5  
       8h 29m ago   ❤️ 1
    我以及身边好几个人,离开 karabiner 就不会用 mac 了。强烈希望苹果给作者一些经济奖励。
    q534
        7
    q534  
       8h 22m ago
    我目前探索到最好用的是,把 caps 定义成短按切换输入法,长按 hyperkey ,配合 hammer 缩放窗口或者快捷打开常用的几个程序。能替代好几个 app ,还方便自定义行为。
    ly1878
        8
    ly1878  
       8h 21m ago
    注意将 hyper+w 逗号 句号 问号 四个组合设置为无效值,否则按下时会产生系统诊断。
    ly1878
        9
    ly1878  
       8h 20m ago
    @q534 我喜欢设置成短按为 Esc
    @gpt5 我也是如此,没有 KE 永不好 mac 了。
    ly1878
        10
    ly1878  
       8h 19m ago
    @dantifer op 大概也会喜欢用 chrome 的 vimum C 这款扩展吧。
    q534
        11
    q534  
       8h 12m ago
    @ly1878 #9 啊?那原来的 ESC 干什么
    11ze
        12
    11ze  
       8h 9m ago
    我一直在用 karabinar + https://github.com/Vonng/Capslock ,超级好用
    ruolis
        13
    ruolis  
       7h 58m ago
    目前使用 Karabiner 就增加了一个映射,短按 shift 切换输入法
    fds
        14
    fds  
       7h 51m ago
    Karabiner 之前升级系统是总有几天不能用,所以后来我统一用回 hammerspoon 了。
    我也是用 @jheroy 类似的 launcher 模式,在 hammerspoon 里仿造了一个,按住任意键超过 300ms 激活一个配置好的模式(并显示一个提示框),然后按另一个键启动或切换 app 、执行脚本等等。提示框里有每个键的功能,所以不怕遗忘。不过 hammerspoon 灵敏度不如 Karabiner ,会影响按键本身的手感,所以我都是配在 tab 斜杠等等不常用的键上,两组基本就够用。tab+启动时,只用左手就能完成,很方便。
    还有一些小功能:自动把鼠标移到激活的窗口中心;根据 idle 情况提醒我休息;屏幕配置热区激活调度中心。
    ly1878
        15
    ly1878  
       7h 35m ago
    @q534 可以自定义,也可以设置成 hyper+esc 为切换输入法,因为我删掉了自带的 abc ,所以用不上切换输入法。我感觉 Esc 使用频率更高。
    dantifer
        17
    dantifer  
    OP
       7h 10m ago
    @q534 我发现“切换”输入法这个语义不清晰,最好用的反而不是切换,而是直接设定到英文或者中文。避免你自己也不知道到底切换到哪个了。我是把右 shift 定义成,切换输入法到英文。
    SachinBeyond
        18
    SachinBeyond  
       7h 2m ago
    @jheroy 我有一个疑问,关于按住 o 不放再按 q 就是打开 QQ .

    正常情况下(在没有配置 o+q 的时候) o 这个按键是按下时触发, 也就是按下 o 就会输出字符 o. 一旦你配置了 按住 o 不放再按 q 就是打开 QQ 那么 o 是不是就变成了 松开时触发, 也就是只有松开 o 的时候才会输出 o?
    那这样的话 如果你打字比较快的话 比如 ong, 按下 n 的时候 o 可能还没有释放, 所以可能会输出 nog.

    我说正确吗?
    jheroy
        19
    jheroy  
       6h 46m ago via iPhone
    @SachinBeyond 不会组合键是有严格顺序的, 只有 o 按下 q 按下,q 释放,o 释放的顺序才能触发(按快捷键一般是这样的动作),如果是 o 按下,q 按下 o 释放 q 释放会触发输入 oq
    SachinBeyond
        20
    SachinBeyond  
       6h 5m ago
    @jheroy #19 不太懂 mac 中按键是怎么触发的.

    我有点好奇, 比如 我 快速按下 ong 三个字符, 但是 按下 n 的时候 o 还没有释放,按照我的理解:o 是在 up 的时候才会输出字符 o, 所以 最终得到的字符就是 nog, 而不是 ong.
    根本原因在于 配置了 o & p 这个热键, 导致 原本 o 是 down 的时候输出字符 o 变成了 只有 o 是 up 的时候才会输出字符 o
    jheroy
        21
    jheroy  
       5h 45m ago via iPhone
    @SachinBeyond 那你 n 释放肯定在 o 释放后面啊所以 n 还是在 o 后面,除非你故意按住 n 不放,正常打字是不会这样的吧,基本上每个键敲击时间差不多。
    SachinBeyond
        22
    SachinBeyond  
       5h 31m ago
    @jheroy #21 windows 中 字符按键 是 按下时触发, 就是说 ong 中的 n 在按下的时候就会触发输出字符 n, 而 由于 配置了 o & q 打开 qq, o 按键是 释放时触发, 所以 Windows 中不关心 n 的释放 在 o 的释放前面还是后面. 所以只要 o 按下没有释放的时候 又按下了 n ,必然就是 no 而不是 on.

    至于 mac 我不太清楚, 这也正是我疑惑的地方.
    jheroy
        23
    jheroy  
       4h 19m ago via iPhone
    @SachinBeyond 这和系统没关系,实际上 windows 也可以装 kmonad ,也能实现释放才输入字符。
    migim
        24
    migim  
       3h 47m ago
    @SachinBeyond 这类配置的触发条件其实挺严的,默认阈值是在 50 毫秒内按下所有按键,基本等于同时按下才能触发。按键顺序也不是必要的,当然想调也有对应参数
    Immortal
        25
    Immortal  
       3h 41m ago
    以前也折腾过 OP 说的两个软件,虽然很 Hack,还是不够方便.
    后来发现 Raycast(启动工具)和 Rectangle(窗口管理工具)完全能够满足上面 OP 说的需求.

    我在 Raycast 中给窗用的软件设置了快捷键(CMD+N).对于 10 个不同的常用应用.直接可以达到 OP 说的"没有就启用,启用了就打开应用窗口".
    至于 Rectangle,开源且免费,开箱即用,记住几个常用组合快捷键即可.
    dantifer
        26
    dantifer  
    OP
       3h 35m ago
    @Immortal 其实你要是不启用 hyperkey ,而是愿意直接使用 CMD 的话,hammerspoon 一个就够了...
    SachinBeyond
        27
    SachinBeyond  
       3h 9m ago
    @jheroy #23 这么有意思吗? Windows 上我用 autohotkey 卡了很久, 我取看看 kmonad , 谢谢兄 der
    SachinBeyond
        28
    SachinBeyond  
       2h 47m ago
    @migim
    @jheroy #23
    https://i.postimg.cc/SKDk2TwZ/FS-2026-06-29-150436.png
    QMK 存在这样的问题, 我觉得 mac 也有这样的问题.
    最好的解决方案就是 不要用 字母按键作为 修饰键.不然就会影响正常的连打输入
    jheroy
        29
    jheroy  
       2h 23m ago
    @SachinBeyond mac 没问题,karabiner 的做法比较合理,kmonad 我用过 linux 下的驱动和 windows 应该一样(但是 mac 版 kmonad 用的驱动实际上是 karabiner 的)。linux 用这种模式要么牺牲连按重复输入功能(比如按住 i 不放一直输入 i ),要么放弃这种快捷键, 之前我 linux 上是普通字母放弃重复输入功能(用的少),但是空格键方向键回车键保留这个功能(用的多)。 mac 完全没有这个问题(老版本其实也有,但是新版本引入了我上面说的按键需要按一定规则触发的功能)。
    migim
        30
    migim  
       2h 18m ago
    @SachinBeyond #28 Mac 上不存在这个问题,karabiner 是自己写了个驱动直接拦截原始输入,处理完才交给系统
    neptuno
        31
    neptuno  
       2h 3m ago
    再推荐一个软件:keyboard Maestro ,很好用
    jheroy
        32
    jheroy  
       2h 1m ago
    @SachinBeyond karabiner 可以做到这一点是它并不是每个按键独立触发而是后续按键顺序会影响前面按键的逻辑(这也导致配置异常复杂需要各种条件,然后就有了 GokuRakuJoudo 这样的用简单配置生成 karabiner 复杂配置的工具)。 就比如你说的 ong, 如果你 o->n 是一个快捷键, 那么先按 o 再按 n 释放 n 释放 o 这样触发快捷键,逻辑是没问题的, 先按 o 再按 n 然后 o 释放 n 释放,这样触发输入 on 也是没问题的, 如果 o->n 没有绑定快捷键,那么先按 o 再按 n 这个时候 o 就会知道不是按快捷键解释(因为没有绑定)直接输出 on 。
    Dewchame
        33
    Dewchame  
       1h 39m ago
    感觉 op 的这个经验和全局鼠标手势快速启动 app 很像
    dantifer
        34
    dantifer  
    OP
       1h 33m ago
    @neptuno 这两个都是开源免费软件啊
    oktango
        35
    oktango  
       1h 10m ago
    歪楼问一下楼主,MacBook 外接屏设置菜单栏隐藏后,Chrome 切换标签页的时候,鼠标一下移动到顶部老是容易误触换出菜单栏。。这个有什么好办法可以解决不?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4803 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 09:55 · PVG 17:55 · LAX 02:55 · JFK 05:55
    ♥ Do have faith in what you're doing.