爱意满满的作品展示区。
loggerhead

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

  •  
  •   loggerhead ·
    loggerhead · Mar 23, 2016 · 7979 views
    This topic created in 3722 days ago, the information mentioned may be changed or developed.

    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 中。

    Supplement 1  ·  Mar 23, 2016

    下图演示了 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

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

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

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

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

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

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

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