V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
loggerhead
V2EX  ›  分享创造

给神器 Karabiner 写了个工具简化它的配置

  •  
  •   loggerhead ·
    loggerhead · 2016-03-23 13:12:06 +08:00 · 6808 次点击
    这是一个创建于 2927 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Karabiner ?啥玩意儿?

    Karabiner 是一款 OS X 下十分强大的改键软件,它可以做到 根据上下文改键 ,与之类似的有 Windows 下的 AutoHotKey。不过你可能以为自己并没有改键需求,但是相信你一定遇到过这些情况:

    • Cmd+Ctrl+F 想全屏,发现 Sublime 、 Chrome 等都正常,但是 Skim 没反应、 VirtualBox 没反应, iTerm2 也没反应 Σ( ° △ °) 仔细一看:

      • Skim :Cmd+Shift+F
      • iTerm2 :Cmd+return
      • VirtualBox :Cmd+F

      (╯°Д°)╯ ┻━┻

    • Windows ( VirtualBox )用得好好的,想要复制文本,本能的按下了 Cmd+C……

    想用 Karabiner ,但是…

    <?xml version="1.0" ?>
    <root>
      <item>
        <name>My Config</name>
        <item>
          <name>Enable</name>
          <identifier>private.example</identifier>
          <block>
            <only>TERMINAL</only>
            <autogen> __KeyToKey__
              KeyCode::F, ModifierFlag::CONTROL_L, ModifierFlag::COMMAND_L, ModifierFlag::NONE,
              KeyCode::RETURN, ModifierFlag::COMMAND_R
            </autogen>
          </block>
          <block>
            <only>SKIM</only>
            <autogen> __KeyToKey__
              KeyCode::F, ModifierFlag::CONTROL_L, ModifierFlag::COMMAND_L, ModifierFlag::NONE,
              KeyCode::F, ModifierFlag::COMMAND_R, ModifierFlag::SHIFT_R
            </autogen>
          </block>
          <block>
            <only>VIRTUALMACHINE</only>
            <autogen> __KeyToKey__
              KeyCode::F, ModifierFlag::CONTROL_L, ModifierFlag::COMMAND_L, ModifierFlag::NONE,
              KeyCode::F, ModifierFlag::COMMAND_L
            </autogen>
          </block>
        </item>
      </item>
    </root>
    

    XML 谁不懂,但你这 __KeyToKey__ 干嘛的?我咋知道啥时候用 ModifierFlag::,啥时候用 KeyCode::ModifierFlag::NONE 又是个什么鬼?

    Life is short, use Easy-Karabiner

    简单的讲,Easy-Karabiner 会将你写的 python config “翻译”成 Karabiner 那种神 TM 能理解的 XML 配置。比如,上面的配置用 Easy-Karabiner 实现就是:

    # example.py
    REMAPS = [
        ['ctrl cmd F', 'cmd_r return'   , ['TERMINAL']],
        ['ctrl cmd F', 'cmd_r shift_r F', ['SKIM']],
        ['ctrl cmd F', 'cmd F'          , ['VIRTUALMACHINE']],
    ]
    

    然后你只需 easy_karabiner example.py 就自动生成了配置并重新加载。

    安装只需要 pip install easy_karabiner 即可,兼容 Python 3 。更详细的用法,见 readme

    和 Karabiner DSL 的区别

    Karabiner DSL 是用 ruby 实现的一个类似的工具,但是它还不够简单,而且稍微复杂的配置就难以实现了。比如:

    <autogen>__KeyToKey__           
        KeyCode::LAUNCHPAD,   
        KeyCode::F4
    </autogen>
    <autogen>__ConsumerToKey__      
        ConsumerKeyCode::BRIGHTNESS_DOWN, 
        KeyCode::F1
    </autogen>
    <autogen>__ConsumerToConsumer__ 
        ConsumerKeyCode::KEYBOARDLIGHT_LOW,  
        ConsumerKeyCode::BRIGHTNESS_DOWN
    </autogen>
    

    就得写成

    item 'sample' do
      remap 'launchpad', to: 'F4'
      autogen '__ConsumerToKey__  ConsumerKeyCode::BRIGHTNESS_DOWN, KeyCode::F1'
      autogen '__ConsumerToConsumer__ ConsumerKeyCode::KEYBOARDLIGHT_LOW, ConsumerKeyCode::BRIGHTNESS_DOWN'
    end
    

    跪求建议

    老实说, Easy-Karabiner 实现得并不优雅,所以我希望将它设计得更简单一些,但是有几个问题需要运行 10.11 的同学帮忙确认一下:

    1. mdfind kMDItemContentType==com.apple.application-bundle 运行结果是一堆以 .app 结尾的路径吗?
    2. mdls -name kMDItemCFBundleIdentifier -r /System/Library/CoreServices/Finder.app/ 运行结果是 com.apple.finder 吗?

    如果运行结果和我预期的一样,那么可以将它实现得更易用一些,比如:

    # example.py
    REMAPS = [
        ['ctrl cmd F', 'cmd_r return'   , ['iTerm.app']],
        ['ctrl cmd F', 'cmd_r shift_r F', ['Skim.app']],
        ['ctrl cmd F', 'cmd F'          , ['VitrualBox.app']],
    ]
    

    另外, Karabiner 支持很多复杂的配置,但是我用得很少,而且 Karabiner 本身的文档也不多,可能这部分配置 Easy-Karabiner 支持得不太好。如果有同学希望 Easy-Karabiner 支持这些功能,请在 Feature request 给出 example功能介绍,比如:

    <block>
        <device_not> 
            DeviceVendor::APPLE_COMPUTER, 
            DeviceProduct::ANY 
        </device_not>
        <autogen> __FlipScrollWheel__ 
            Option::FLIPSCROLLWHEEL_VERTICAL 
        </autogen>
    </block>
    
    在不是苹果外设的情况下,反转滚动方向
    

    要是能给出 syntax 就更好了 :)

    如果你觉得 Easy-Karabiner 有帮助,在 Feature request 上点个赞吧~

    zan

    最后,欢迎在 Feature request 提出你的任何建议或观点,所有建议都会考虑加入 Easy-Karabiner2 中。

    第 1 条附言  ·  2016-03-23 17:35:06 +08:00

    下图演示了 Karabiner 的一些映射:

    • Alt+S => Open Sublime
    • Alt+E => Open Finder
    • Alt+A => Open iTerm
    • 连按两次 Fn => F12
    • 长按 Esc => Ctrl+Alt+Cmd+Shift
    • iTerm: Cmd+Ctrl+F => Cmd+Enter
    • Skim: Cmd+Ctrl+F => Cmd+Shift+F

    out.gif

    第 2 条附言  ·  2016-05-14 15:17:13 +08:00
    Easy-Karabiner2 ( v0.5.0 )已完成~
    37 条回复    2016-11-30 00:04:03 +08:00
    GPU
        1
    GPU  
       2016-03-23 15:16:03 +08:00
    需要我还没有苹果电脑,但是这么好的东西居然一个人都没有回帖?

    不科学啊. 还 101 次点击
    loggerhead
        2
    loggerhead  
    OP
       2016-03-23 15:54:05 +08:00
    @GPU Karabiner 确实是个好东西啊~开源免费, CPU 和 内存也占用非常少(相对其它同类软件而言)。不过可能改键这种需求还是比较小众吧……
    GPU
        3
    GPU  
       2016-03-23 15:56:26 +08:00
    @loggerhead 根據上下文不錯啊 .雖然我也不怎麼改.

    畢竟改鍵這種東西,你不能每台電腦都改 ,如果改了長期用會導致到了其他電腦非常不順手.
    loggerhead
        4
    loggerhead  
    OP
       2016-03-23 16:12:47 +08:00
    @GPU 确实现在用 Ubuntu 就很不习惯。。。不过常用的电脑改了以后用着很爽啊。

    想想作为一个 Vimer , Caps 键即能当 control 用,又能当 esc 用,那不是草上飞么!或者作为 Emacser ,全局 Ctrl+P/N/F/B 取代方向键简直爽,无论是 Finder 、 Chrome 、 Skim 或其他任何软件,都不需要再安装什么插件了。并且 Karabiner 改键以后能减少好多快捷键记忆的负担,简直爽翻~
    GPU
        5
    GPU  
       2016-03-23 16:15:55 +08:00
    @loggerhead Windows 并沒有這麼酸爽.
    loggerhead
        6
    loggerhead  
    OP
       2016-03-23 16:16:37 +08:00
    @GPU Karabiner 还能实现全局 vim ,只不过我没这个需求,所以没用过。
    mhqschen
        7
    mhqschen  
       2016-03-23 16:16:51 +08:00
    如果能做个傻瓜化的 GUI 出来,就更感人了~
    loggerhead
        8
    loggerhead  
    OP
       2016-03-23 16:21:07 +08:00
    对了,我做个 gif ,大家都知道为什么 Karabiner 是神器了~
    loggerhead
        9
    loggerhead  
    OP
       2016-03-23 16:22:51 +08:00
    @mhqschen Google Group 里有人提出相同的问题,不过 GUI 不方便实现复杂的配置(想想你怎么组织菜单或按钮来安放那么多功能)。如果改键需求很简单的话,其实用 Easy-Karabiner 也很简单。
    hstdt
        10
    hstdt  
       2016-03-23 18:58:57 +08:00
    我一般用 Karabiner 实现 F2 F3
    hstdt
        11
    hstdt  
       2016-03-23 19:00:10 +08:00
    我一般用 Karabiner 实现 F2 F3 切换浏览器和 Finder 的标签.灰常好用!
    loggerhead
        12
    loggerhead  
    OP
       2016-03-23 19:00:35 +08:00
    @hstdt 哈哈,我也差不多,只不过把 F1-F4 都映射回去了,然后 F5 、 F6 来调屏幕亮度。
    wph95
        13
    wph95  
       2016-03-23 22:02:19 +08:00
    Karabiner 神器,入了 hhkb 后各种用 Karabiner 改键
    wph95
        14
    wph95  
       2016-03-23 22:02:56 +08:00   ❤️ 1
    & 要不项目叫 oh my karabiner 吧 ,大雾
    loggerhead
        15
    loggerhead  
    OP
       2016-03-23 22:42:38 +08:00
    @wph95 擦,我咋没想到这个名字 Σ( ° △ °)
    sinker
        16
    sinker  
       2016-03-23 22:43:29 +08:00 via iPhone
    怎么说呢,真正要写 private.xml 的人一般早就写了(比如本人)。而没这个需求的人估计也不怎么用得上这个简化版的配置。要不是没有时间的话还是很有兴趣和 lz 一起推广 Karabiner 的,毕竟它已经是我日常离不开的软件之一来。目前只能先精神上支持了...
    loggerhead
        17
    loggerhead  
    OP
       2016-03-23 22:44:49 +08:00
    @sinker 确实,只不过偶尔需要改改的时候还得去翻文档,挺麻烦的。
    sinker
        18
    sinker  
       2016-03-23 22:46:16 +08:00 via iPhone
    @loggerhead 握爪,你说的就是我现在用的方案的一部分
    sinker
        19
    sinker  
       2016-03-23 23:27:22 +08:00 via iPhone
    @loggerhead 我个人的基本框架不怎么变了。基本的语法也都记得差不多了,所以想着自己能用就行也就没折腾更多了。
    loggerhead
        20
    loggerhead  
    OP
       2016-03-24 10:53:11 +08:00
    @sinker 嗯嗯,本来我也是,后来有点新的改键需求,发现还得看文档,就做了这个东西~
    jayzjj000
        21
    jayzjj000  
       2016-03-24 11:09:06 +08:00
    FZ 大神顶顶顶~~

    话说,既然是简化版,就往最简化版想呗
    比如建个 GUI ,像游戏按键映射一样,点左边按一下映射前的按键,点右边按一下映射后的按键~
    loggerhead
        22
    loggerhead  
    OP
       2016-03-24 14:12:41 +08:00
    @jayzjj000 主要是 GUI 不方便,简单的键映射还好说,稍微复杂点的配置用 GUI 就难以优雅的表达,比如:连按 Fn 两次、长按 Esc 、反转鼠标等等。(好吧,其实是我不懂 OC ……)

    PS :这也是图形界面的通病,想想你用 IDE 到处找某个功能是有多蛋疼和低效,所以 Sublime 的 Goto Anything 才那么火~

    好久不见啦~在 A 厂日子过得可舒畅?
    jayzjj000
        23
    jayzjj000  
       2016-03-25 21:18:55 +08:00
    @loggerhead 各种加班呀,还好周末还有的耍,平时真是忙成狗
    loggerhead
        24
    loggerhead  
    OP
       2016-03-25 22:31:07 +08:00
    @jayzjj000 不会吧,大厂还加班……不过这样磨练下来,技术肯定蹭蹭蹭的往上升,哈哈
    morewe
        25
    morewe  
       2016-03-28 22:54:47 +08:00
    为了映射 filco minila 的 app 键,用了 Karabiner 棒棒哒!
    只按 app 键映射成 cmd+空格,按 app 键加其他键,映射成 cmd 键~
    loggerhead
        26
    loggerhead  
    OP
       2016-03-28 23:14:41 +08:00
    @morewe 哈哈,说了是神器吧!
    guoc
        27
    guoc  
       2016-03-29 11:16:08 +08:00   ❤️ 1
    我用 10.11 ,两个问题都确认了,符合预期。
    loggerhead
        28
    loggerhead  
    OP
       2016-03-29 12:13:53 +08:00 via iPhone
    @guoc thanks
    liaa
        29
    liaa  
       2016-04-05 21:36:53 +08:00
    @loggerhead 更希望楼主出一个你日常是如何使用 Karabiner. 我装 Karabiner 用了这个配置:
    1. 单按 caps lock 就是 esc
    2. caps lock 和其他键组合(如 p) 就相当于 ctrl+p
    这样用 vim 很爽.
    loggerhead
        30
    loggerhead  
    OP
       2016-04-05 22:13:59 +08:00
    @liaa 喔喔,那回头我写篇博客详细介绍下 Karabiner~
    OiCkilL
        31
    OiCkilL  
       2016-04-14 18:55:23 +08:00
    第三方键盘貌似没法识别 fn 键。。。
    loggerhead
        32
    loggerhead  
    OP
       2016-04-14 19:00:06 +08:00
    @OiCkilL 你打开 Karabiner 找到 Misc & Uninstall -> Launch EventViewer -> Main ,然后按下 Fn 看它识别出来是什么。不同键盘对 Fn 的处理不一样,你可以看看文档 https://pqrs.org/osx/karabiner/faq.html.en#fn-logitech
    OiCkilL
        33
    OiCkilL  
       2016-04-14 19:10:54 +08:00
    @loggerhead 貌似识别不出来,应该是按 fn 的时候没有发送任何信号给系统
    loggerhead
        34
    loggerhead  
    OP
       2016-04-14 19:13:26 +08:00
    @OiCkilL 那就没得办法咯。不过如果你需要 Fn 的功能的话,可以把其他键映射成 Fn ~
    jhalan6
        35
    jhalan6  
       2016-10-13 11:41:12 +08:00
    最近对 Karabiner 很感兴趣,还想有机会的话来想办法推广下,不知道楼主之前帖子里说要写的推广 karabiner 的帖子完成了否?(讲道理,觉得很多场景, karabiner 比 Alfred 更 nb 。。
    loggerhead
        36
    loggerhead  
    OP
       2016-10-13 12:46:10 +08:00
    @jhalan6 拖延症犯了,然后就不了了之了……
    huyansheng3
        37
    huyansheng3  
       2016-11-30 00:04:03 +08:00
    能够根据上下文改建太棒了! mac 下全屏不一致,各种 app 快捷键不一致!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3732 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:14 · PVG 08:14 · LAX 17:14 · JFK 20:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.