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

2016-03-23 13:12:06 +08:00
 loggerhead

Karabiner ?啥玩意儿?

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

想用 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 上点个赞吧~

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

6867 次点击
所在节点    分享创造
37 条回复
jayzjj000
2016-03-24 11:09:06 +08:00
FZ 大神顶顶顶~~

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

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

好久不见啦~在 A 厂日子过得可舒畅?
jayzjj000
2016-03-25 21:18:55 +08:00
@loggerhead 各种加班呀,还好周末还有的耍,平时真是忙成狗
loggerhead
2016-03-25 22:31:07 +08:00
@jayzjj000 不会吧,大厂还加班……不过这样磨练下来,技术肯定蹭蹭蹭的往上升,哈哈
morewe
2016-03-28 22:54:47 +08:00
为了映射 filco minila 的 app 键,用了 Karabiner 棒棒哒!
只按 app 键映射成 cmd+空格,按 app 键加其他键,映射成 cmd 键~
loggerhead
2016-03-28 23:14:41 +08:00
@morewe 哈哈,说了是神器吧!
guoc
2016-03-29 11:16:08 +08:00
我用 10.11 ,两个问题都确认了,符合预期。
loggerhead
2016-03-29 12:13:53 +08:00
@guoc thanks
liaa
2016-04-05 21:36:53 +08:00
@loggerhead 更希望楼主出一个你日常是如何使用 Karabiner. 我装 Karabiner 用了这个配置:
1. 单按 caps lock 就是 esc
2. caps lock 和其他键组合(如 p) 就相当于 ctrl+p
这样用 vim 很爽.
loggerhead
2016-04-05 22:13:59 +08:00
@liaa 喔喔,那回头我写篇博客详细介绍下 Karabiner~
OiCkilL
2016-04-14 18:55:23 +08:00
第三方键盘貌似没法识别 fn 键。。。
loggerhead
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
2016-04-14 19:10:54 +08:00
@loggerhead 貌似识别不出来,应该是按 fn 的时候没有发送任何信号给系统
loggerhead
2016-04-14 19:13:26 +08:00
@OiCkilL 那就没得办法咯。不过如果你需要 Fn 的功能的话,可以把其他键映射成 Fn ~
jhalan6
2016-10-13 11:41:12 +08:00
最近对 Karabiner 很感兴趣,还想有机会的话来想办法推广下,不知道楼主之前帖子里说要写的推广 karabiner 的帖子完成了否?(讲道理,觉得很多场景, karabiner 比 Alfred 更 nb 。。
loggerhead
2016-10-13 12:46:10 +08:00
@jhalan6 拖延症犯了,然后就不了了之了……
huyansheng3
2016-11-30 00:04:03 +08:00
能够根据上下文改建太棒了! mac 下全屏不一致,各种 app 快捷键不一致!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX