给神器 Karabiner 写了个工具简化它的配置 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
loggerhead
V2EX    分享创造

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

  •  
  •   loggerhead
    loggerhead 2016 年 3 月 23 日 7810 次点击
    这是一个创建于 3645 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 年 3 月 23 日

    下图演示了 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 年 5 月 14 日
    Easy-Karabiner2 ( v0.5.0 )已完成~
    37 条回复    2016-11-30 00:04:03 +08:00
    GPU
        1
    GPU  
       2016 年 3 月 23 日
    需要我还没有苹果电脑,但是这么好的东西居然一个人都没有回帖?

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

    竟改西,你不能每台都改 ,如果改了期用致到了其他非常不手.
    loggerhead
        4
    loggerhead  
    OP
       2016 年 3 月 23 日
    @GPU 确实现在用 Ubuntu 就很不习惯。。。不过常用的电脑改了以后用着很爽啊。

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

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

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

    好久不见啦~在 A 厂日子过得可舒畅?
    jayzjj000
        23
    jayzjj000  
       2016 年 3 月 25 日
    @loggerhead 各种加班呀,还好周末还有的耍,平时真是忙成狗
    loggerhead
        24
    loggerhead  
    OP
       2016 年 3 月 25 日
    @jayzjj000 不会吧,大厂还加班……不过这样磨练下来,技术肯定蹭蹭蹭的往上升,哈哈
    morewe
        25
    morewe  
       2016 年 3 月 28 日
    为了映射 filco minila 的 app 键,用了 Karabiner 棒棒哒!
    只按 app 键映射成 cmd+空格,按 app 键加其他键,映射成 cmd 键~
    loggerhead
        26
    loggerhead  
    OP
       2016 年 3 月 28 日
    @morewe 哈哈,说了是神器吧!
    guoc
        27
    guoc  
       2016 年 3 月 29 日   1
    我用 10.11 ,两个问题都确认了,符合预期。
    loggerhead
        28
    loggerhead  
    OP
       2016 年 3 月 29 日 via iPhone
    @guoc thanks
    liaa
        29
    liaa  
       2016 年 4 月 5 日
    @loggerhead 更希望楼主出一个你日常是如何使用 Karabiner. 我装 Karabiner 用了这个配置:
    1. 单按 caps lock 就是 esc
    2. caps lock 和其他键组合(如 p) 就相当于 ctrl+p
    这样用 vim 很爽.
    loggerhead
        30
    loggerhead  
    OP
       2016 年 4 月 5 日
    @liaa 喔喔,那回头我写篇博客详细介绍下 Karabiner~
    OiCkilL
        31
    OiCkilL  
       2016 年 4 月 14 日
    第三方键盘貌似没法识别 fn 键。。。
    loggerhead
        32
    loggerhead  
    OP
       2016 年 4 月 14 日
    @OiCkilL 你打开 Karabiner 找到 Misc & Uninstall -> Launch EventViewer -> Main ,然后按下 Fn 看它识别出来是什么。不同键盘对 Fn 的处理不一样,你可以看看文档 https://pqrs.org/osx/karabiner/faq.html.en#fn-logitech
    OiCkilL
        33
    OiCkilL  
       2016 年 4 月 14 日
    @loggerhead 貌似识别不出来,应该是按 fn 的时候没有发送任何信号给系统
    loggerhead
        34
    loggerhead  
    OP
       2016 年 4 月 14 日
    @OiCkilL 那就没得办法咯。不过如果你需要 Fn 的功能的话,可以把其他键映射成 Fn ~
    jhalan6
        35
    jhalan6  
       2016 年 10 月 13 日
    最近对 Karabiner 很感兴趣,还想有机会的话来想办法推广下,不知道楼主之前帖子里说要写的推广 karabiner 的帖子完成了否?(讲道理,觉得很多场景, karabiner 比 Alfred 更 nb 。。
    loggerhead
        36
    loggerhead  
    OP
       2016 年 10 月 13 日
    @jhalan6 拖延症犯了,然后就不了了之了……
    huyansheng3
        37
    huyansheng3  
       2016 年 11 月 30 日
    能够根据上下文改建太棒了! mac 下全屏不一致,各种 app 快捷键不一致!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5669 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 09:10 PVG 17:10 LAX 02:10 JFK 05:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86