给神器 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 中。

7090 次点击
所在节点    分享创造
37 条回复
GPU
2016-03-23 15:16:03 +08:00
需要我还没有苹果电脑,但是这么好的东西居然一个人都没有回帖?

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

畢竟改鍵這種東西,你不能每台電腦都改 ,如果改了長期用會導致到了其他電腦非常不順手.
loggerhead
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
2016-03-23 16:15:55 +08:00
@loggerhead Windows 并沒有這麼酸爽.
loggerhead
2016-03-23 16:16:37 +08:00
@GPU Karabiner 还能实现全局 vim ,只不过我没这个需求,所以没用过。
mhqschen
2016-03-23 16:16:51 +08:00
如果能做个傻瓜化的 GUI 出来,就更感人了~
loggerhead
2016-03-23 16:21:07 +08:00
对了,我做个 gif ,大家都知道为什么 Karabiner 是神器了~
loggerhead
2016-03-23 16:22:51 +08:00
@mhqschen Google Group 里有人提出相同的问题,不过 GUI 不方便实现复杂的配置(想想你怎么组织菜单或按钮来安放那么多功能)。如果改键需求很简单的话,其实用 Easy-Karabiner 也很简单。
hstdt
2016-03-23 18:58:57 +08:00
我一般用 Karabiner 实现 F2 F3
hstdt
2016-03-23 19:00:10 +08:00
我一般用 Karabiner 实现 F2 F3 切换浏览器和 Finder 的标签.灰常好用!
loggerhead
2016-03-23 19:00:35 +08:00
@hstdt 哈哈,我也差不多,只不过把 F1-F4 都映射回去了,然后 F5 、 F6 来调屏幕亮度。
wph95
2016-03-23 22:02:19 +08:00
Karabiner 神器,入了 hhkb 后各种用 Karabiner 改键
wph95
2016-03-23 22:02:56 +08:00
& 要不项目叫 oh my karabiner 吧 ,大雾
loggerhead
2016-03-23 22:42:38 +08:00
@wph95 擦,我咋没想到这个名字 Σ( ° △ °)
sinker
2016-03-23 22:43:29 +08:00
怎么说呢,真正要写 private.xml 的人一般早就写了(比如本人)。而没这个需求的人估计也不怎么用得上这个简化版的配置。要不是没有时间的话还是很有兴趣和 lz 一起推广 Karabiner 的,毕竟它已经是我日常离不开的软件之一来。目前只能先精神上支持了...
loggerhead
2016-03-23 22:44:49 +08:00
@sinker 确实,只不过偶尔需要改改的时候还得去翻文档,挺麻烦的。
sinker
2016-03-23 22:46:16 +08:00
@loggerhead 握爪,你说的就是我现在用的方案的一部分
sinker
2016-03-23 23:27:22 +08:00
@loggerhead 我个人的基本框架不怎么变了。基本的语法也都记得差不多了,所以想着自己能用就行也就没折腾更多了。
loggerhead
2016-03-24 10:53:11 +08:00
@sinker 嗯嗯,本来我也是,后来有点新的改键需求,发现还得看文档,就做了这个东西~

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

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

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

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

© 2021 V2EX