对指定程序设置Function Key映射

Mac键盘最上面一排F1~F12,默认是一些OS X系统的功能,比如调节亮度、音量、键盘灯亮度等等,非常实用。但是最近开始用PyCharm写python代码,发现调试的时候,每次用F7,F8 做 step in,step over之类的操作,需要按住 fn + F7 和 fn + F8,感觉比较麻烦。所以就想用karabiner来做键盘映射。

karabiner 之前叫 KeyRemap4MacBook 用它可以设置很多键盘的映射关系。其实单独改Function Key的映射,mac上有不少软件都能做。但是karabiner的优势在于,可以只针对特定的程序来设置映射关系。

想要实现的效果就是,在使用PyCharm时,按F3~F10不再触发OS X默认的那些功能,比如按F10键不再是静音,而就是触发F10(OS X默认状态下的Fn + F10)。

安装 karabiner 之后,Preferences -> Misc & Uninstall -> Open private.xml

打开private.xml配置文件,设置文件内容如下,即可实现想要的映射。

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>PYCHARM</appname>
    <equal>com.jetbrains.pycharm</equal>
  </appdef>
   <item>
    <name>custom settings</name>
    <item>
      <name>Change Functional Keys to F3...F10 for PyCharm</name>
      <identifier>remap.app_pycharm_functional2function</identifier>
      <only>PYCHARM</only>
      <autogen>__KeyToKey__ KeyCode::EXPOSE_ALL, KeyCode::F3</autogen>
      <autogen>__KeyToKey__ KeyCode::DASHBOARD, KeyCode::F4</autogen>
      <autogen>__KeyToKey__ KeyCode::LAUNCHPAD, KeyCode::F4</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::KEYBOARDLIGHT_LOW, KeyCode::F5</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::KEYBOARDLIGHT_HIGH, KeyCode::F6</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::MUSIC_PREV, KeyCode::F7</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::MUSIC_PLAY, KeyCode::F8</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::MUSIC_NEXT, KeyCode::F9</autogen>
      <autogen>__KeyToKey__ ConsumerKeyCode::VOLUME_MUTE, KeyCode::F10</autogen>
    </item>
  </item>
</root>

参考文档:

https://pqrs.org/osx/karabiner/document.html#privatexml https://pqrs.org/osx/karabiner/xml.html.en

2016-06-21 11:53:28 更新

  • private.xmlappdef定义时,需要知道应用程序的bundle identifiers。如何知道某个应用程序的bundle identifiers呢?

      > osascript -e 'id of app "WebStorm"'
      com.jetbrains.WebStorm
    
      > osascript -e 'id of app "Pycharm"'
      com.jetbrains.pycharm
    
  • 如何对多个特定程序应用同一套规则?

    上面的private.xml中,通过如下对规则使配置仅对PYCHARM生效。

      <only>PYCHARM</only>
    

    如果要对WebStorm也使用同样的配置,可以增加一个appdef

      <appdef>
          <appname>WebStorm</appname>
          <equal>com.jetbrains.WebStorm</equal>
      </appdef>
    

    再在only中写上

      <only>PYCHARM, WebStorm</only>
    

    appdef也支持按照前缀来做。比如想把jetbrains的IDE全部都包含进去,可以这样配置

      <appdef>
          <appname>JETBRAINS_IDE</appname>
          <prefix>com.jetbrains.</prefix>
      </appdef>
    

Comments