Karabinarのキー置換定義に独自の例外アプリ指定を設定する

世界一標高の高い水族館は長野県茅野市にある蓼科アミューズメント水族館だそうです。一度行ったことがありますが、オススメです。内陸県とあって淡水魚中心に扱っていて、また北八ヶ岳ロープウェイのすぐ下だったりするので、夏の避暑には最高です。

さて、ぼくは普段はLinuxを使っていて、そこに数年前からMacを併用して使うようになったため、Commandキーを中心としたショートカットキーの違いが地味にストレスになります。
そこで、Macでキー入力の解釈を強制的に上書きするツールKarabinarを使っていました。

具体的には一例として、MacでもLinux/Windowsと同じくCtrl+C/X/Vでそれぞれコピー・カット・ペーストをできるようにしたかったのです。
この場合、Karabinarで標準で用意されている「Use PC Style Copy/Paste」を有効にすればOKです。

karabinar_pc_style_copy_paste

しかしながら、私は例えばコーディングなどにPyCharmやRubyMineをvimキーバインドにして使っていて、このときショートカットキー設定がコンフリクトし、Karabinarが優先されることになります。
(具体的には例えばvimでCtrl+vは矩形編集に使うのですが、KarabinarによってOption+Vに置換され結局ペーストが行われます。)
したがって、普段はCtrl+C/X/VをコピペにつかうんだけどPyCharmがアクティブウィンドウになっているときだけそれをナシにする…というような設定をKarabinarに対して行いました。
ここまででやっとタイトルについて説明できた

似たようなことをしている人はすでにいらっしゃって、
OSX上のVirtualBoxを使う時だけKarabinerを無効にする – Qiita
などはわかりやすくまとまっているのですが、僕の場合はKarabinarごと無効化するのはやり過ぎで、単に特定の設定だけ無効化したかったので、ここではそのやり方を説明します。

主な参考資料は設定ファイルXMLのリファレンス
private.xml Reference Manual – Karabiner – Software for OS X
および、/Application/Karabinar.app下に配置されたデフォルト設定です。

アプローチ

ざっくりと次のようなことをやります。

  • Karabinar標準定義のキー置換設定をコピペしてカスタム用XML内にもってくる
  • Karabinarが例外対象アプリ(PyCharmなど)を認識できるようにして、先にコピペしたキー置換設定の例外対象に追記する

以降、具体的な作業を解説していきます。

カスタマイズ用XMLを開く

Karabinarの設定はすべてXMLの形で静的に定義されていて、特にユーザ定義の設定はprivate.xmlというファイルに書いていきます。
まずはこのファイルを開きます。

メニューバーのKarabinarアイコンをクリックしPreferenceを開く。
karabinar_open_preference

karabinar_open_private_xml
するとprivate.xmlを含んだディレクトリがFinderが開かれます。

僕の手元の環境では”$HOME/Library/Application Support/Karabiner/private.xml”にありました。

アプリケーション名を調べてXMLに定義する

Ctrl+X/V/Cの置換を適用させないアプリケーションを記述するため、まずはアプリ名を調べます。
メニューバーのKarabinarアイコンから、EventViewerを起動。

karabinar_start_event_viewer

EventViewerが開いたら、例外指定をしたいアプリのウィンドウをいったんアクティブにします。ここではPyCharmです。
そうするとKarabinarがそれを検出して、画面に出してくれます。
karabinar_get_app_name

これで、PyCharmを識別する名前が“com.jetbrains.pycharm”であることがわかりました。

これをprivate.xml内で指定できるようにするために、上に貼ったprivate.xmlのリファレンスにしたがってappdefを記述します。

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>PYCHARM</appname>
    <equal>com.jetbrains.pycharm</equal>
  </appdef>
</root>

これで、private.xml内でPYCHARMという名前でPyCharmを例外指定等に使えるようになります(まだXMLは完成ではありません)。

ちなみに、ブラウザ(FIREFOX,GOOGLE_CHROME,…)や仮想端末(TERMINAL,…)などは予め同様に定義されていて、手元の環境ではKarabiner.app/Contents/Resources/appdef.xmlに記述されていました。

続いて実際のキーバインドの設定(例外指定付き)です。

Karabinar標準設定のXMLをコピペして、例外指定に追記する

今回は例としてKarabinarのCtrl+C/V/XをCmd+C/V/Xに置換するUse PC Style Copy/Pasteという設定をそのままにして、PyCharm(やRubyMine)だけをその適用の例外としたいため、まずはそのPC Style Copy/Pasteの設定をまるっと拾ってきます。これもKarabinar内でXMLで定義されていますので、コピペで持ってくるだけです。

% cd /Applications
% grep 'Use PC Style Copy/Paste' Karabiner.app -R
...
Karabiner.app/Contents/Resources/include/checkbox/for_pc_users.xml:      <name>Use PC Style Copy/Paste</name>
...

ということで、for_pc_users.xmlというXMLにCtrl+C/V/Xの設定が書かれているので、このファイルから”Use PC Style Copy/Paste”の設定をもつitemタグ部分をまるっとコピペし、さきほどのprivate.xmlに追記します。そこに

  • 設定の名前を自分でわかるよう変更する
  • 例外指定を追記する
  • 例外指定の説明を自分でわかるよう追記する
  • 設定には一意の識別子があるため変更する

というような変更をちょちょっと加えると、全体として下記のようなXMLになります(完成版)。上記のコピペ後の編集部分をハイライトしています。

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>PYCHARM</appname>
    <equal>com.jetbrains.pycharm</equal>
  </appdef>

  <item>
    <name>Use PC Style Copy/Paste (Added PyCharm)</name>
    <appendix>(Control+C to Command_L+C)</appendix>
    <appendix>(Control+V to Command_L+V)</appendix>
    <appendix>(Control+X to Command_L+X)</appendix>
    <appendix></appendix>
    <appendix>{{ PC_STYLE_BINDINGS_IGNORE_APPS_DESCRIPTION }} and PyCharm</appendix>
    <identifier>remap.pc_style_copy_paste_except_for_pycharm</identifier>
    <not>
      {{ PC_STYLE_BINDINGS_IGNORE_APPS }}
      PYCHARM
    </not>
    {{ PC_STYLE_BINDINGS_IGNORE_EXTRA }}
    <autogen>
      __KeyToKey__
      KeyCode::C, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL,
      KeyCode::C, ModifierFlag::COMMAND_L,
    </autogen>
    <autogen>
      __KeyToKey__
      KeyCode::V, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL,
      KeyCode::V, ModifierFlag::COMMAND_L,
    </autogen>
    <autogen>
      __KeyToKey__
      KeyCode::X, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL,
      KeyCode::X, ModifierFlag::COMMAND_L,
    </autogen>
  </item>
</root>

たとえばPyCharm以外のアプリも例外指定する場合(僕の場合はMacVimなど)、アプリケーション定義(<appdef>)を増やし、タグ内にコンマ区切りで列挙すればOKです。

XMLをKarabinarにリロードする

カスタムXMLの編集は完了ですので、ここでKarabinarのPreferenceを開き、XMLをリロードします。
タイポなど問題があれば画面上に警告が現れます。
問題なければ下記のような画面となるはずです。画面に現れる部分としては、設定名と例外指定の説明が書き換わってることがわかると思います。

karabinar_check_in_custom_configuration

ここで、先ほど定義した自分の設定をチェックし有効にします(忘れたらがんばってXML編集した意味ないです)。

また、設定をコピペした元であるオリジナルの既存設定はチェックを外し無効化します(ここではUse PC Style Copy/Paste)。これも忘れたら頑張って編集した意味なくなります。

これでOK!!

この状態で、例外指定したアプリを開いて、ショートカットキーを試してみてください。
僕の場合はPyCharm上でのみ、例えばCtrl+VがペーストでなくPyCharmとして設定された挙動をする…というようになります。


ということで、口で言うとかんたんなことをするために必要な設定作業は結構面倒なかんじでした。
Karabinarの、例外指定等含め全ての設定をXMLとして静的に定義するという設計はなかなか無理があるかんじかもしれない。

方法としては頑張ってprivate.xmlを作るのではなくKarabinar既定の設定であるappdef.xmlとfor_pc_users.xmlを直接上書きしてしまっても動くはずですが、すぐににっちもさっちもいかなくなるので、この記事で説明したような方法をとるのがいちばんいいと思います。

Karabinarの例外設定について困っている方の一助になれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。