Karabiner 是一款 OS X 下十分强大的改键软件,它可以做到 根据上下文改键 ,与之类似的有 Windows 下的 AutoHotKey。不过你可能以为自己并没有改键需求,但是相信你一定遇到过这些情况:
按 Cmd+Ctrl+F
想全屏,发现 Sublime 、 Chrome 等都正常,但是 Skim 没反应、 VirtualBox 没反应, iTerm2 也没反应 Σ( ° △ °) 仔细一看:
Cmd+Shift+F
Cmd+return
Cmd+F
(╯°Д°)╯ ┻━┻
Windows ( VirtualBox )用得好好的,想要复制文本,本能的按下了 Cmd+C
……
<?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
又是个什么鬼?
简单的讲,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 是用 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 的同学帮忙确认一下:
mdfind kMDItemContentType==com.apple.application-bundle
运行结果是一堆以 .app
结尾的路径吗?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 中。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.