IntelliJ IDEAのキーバインド設定をAppCodeでも共有しようとしたらかなりハマった件

当方、開発IDEは基本的にIntelliJ IDEAですが、最近iOSもやってるのでAppCodeもよく利用しています。

www.jetbrains.com

AppCodeはJetBrainsが開発しているiOSMacのアプリケーションを開発するためのIDEです。IDEAに慣れていて、Xcodeがつらたんって人は利用しているのではないでしょうか。

やりたいこと

IntelliJ IDEAで利用しているカスタムキーバインド設定をAppCodeでも利用したかったが、実は一筋縄ではいかなかった

環境

IntelliJから設定をエクスポートする

IntelliJキーバインドEclipseキーバインドのやつを継承して独自にカスタマイズしてます。これをAppCodeでも使いたい。

キーマップの名前はStormcatとしてます(ここはお好きにどうぞ)。

f:id:a-yamada:20150330154147p:plain

File -> Export Settingsを選択すると、設定のエクスポートのダイアログが表示されて、キーバインドを含む諸々の設定をjarファイルとしてエクスポートすることができます。自分はsettings.jarもGitHub管理しているので、dotfilesのリポジトリに直接エクスポートするようにしてます。

f:id:a-yamada:20150330154205p:plain

AppCode側でインポートしてみる

settings.jarがエクスポートできたら、今度はAppCode側でインポートします。File -> Import Settingsでエクスポートしたsettings.jarをインポートしてみます。

次のダイアログが出るのでOKを選択。するとAppCodeの再起動を要求されるので再起動します。

f:id:a-yamada:20150330155212p:plain

インポートされたStormcatキーバインドを確認します。

見てください、このスカスカっぷりを・・・

f:id:a-yamada:20150330160041p:plain

エクスポート元のIntelliJの方と比べるとよくわかりますが、AppCode側でキーバインドを上手く読み込めなかったことがわかります。どうやらエクスポートできたのはキーマップ名だけのようです。

キーマップの設定ファイルを確認する

一体何が起きているのか。こうなったらキーマップの設定ファイルを直接確認してみます。

キーマップの設定ファイルの場所

キーマップの設定ファイルはXML形式で、以下の場所に保持されています。

  • IntelliJ IDEA 14 (Ultimateの場合)  ~/Library/Preferences/IntelliJIdea14/keymaps/キーマップ名.xml

  • AppCode 3.1 ~/Library/Preferences/appCode31/keymaps/キーマップ名.xml

では、IntelliJとAppCodeのキーマップ設定ファイルを比較してみます。左がIntelliJ、右がAppCodeです。

f:id:a-yamada:20150330161139p:plain

パッと見では同じように見えますが、IntelliJにはparent属性としてEclipse (Max OS X)が設定されていますが、AppCodeにはそれがありません。つまりAppCodeの方は継承無しのキーマップ設定となるので、これがスカスカになった原因であると思われます。

AppCodeのデフォルトキーマップ設定

何故AppCode継承無しのキーマップになってしまったのか?それはAppCodeのデフォルトキーマップを見るとよくわかります。

f:id:a-yamada:20150330161738p:plain

この通り、Eclipseというデフォルトキーマップは無いのです。AppCodeでEclipseという親キーマップを探しに行ったが、無かったので親が設定されなかったという感じでしょうね。

EclipseキーマップをAppCodeに移植する

IntelliJのデフォルトキーマップの設定ファイルは、/Applications/IntelliJ IDEA 14.app/Contents/lib/resources.jarに含まれています。これを適当な場所にコピーして解凍します。

解凍するとideaディレクトリができ、その中にキーマップの設定ファイルが格納されています。

今回お目当てのデフォルト設定ファイルはKeymap_EclipseMac.xmlです。ちなみにKeymap_EclipseMac.xmlKeymap_Mac.xmlにも依存しているので、Keymap_EclipseMac.xmlとKeymap_Mac.xmlの2つのファイルを~/Library/Preferences/appCode31/keymapsディレクトリにコピーします。

コピーしたキーマップファイルを修正

実は2つのコピーしたはそのままだとAppCodeで認識できません。この2つのファイルを見てみると、XMLのルート要素が以下のようにcomponentで構成されていますが、これが原因でAppCode側で読み込みに失敗します。

<component>
  <keymap version="1" name="Eclipse (Mac OS X)" disable-mnemonics="false" parent="Mac OS X 10.5+">
    <action id="FileChooser.TogglePathShowing">
      <keyboard-shortcut first-keystroke="meta P"/>
    </action>

    ...(省略)

  </keymap>
</component>

そのため、これを消してkeymap要素がルート要素となるように修正します。

<keymap version="1" name="Eclipse (Mac OS X)" disable-mnemonics="false" parent="Mac OS X 10.5+">
  <action id="FileChooser.TogglePathShowing">
    <keyboard-shortcut first-keystroke="meta P"/>
  </action>

  ...(省略)
</keymap>

カスタムキーマップの設定

最後に、カスタムキーマップのparentをEclipse (Mac OS X)にしてAppCodeを再度起動すれば万事OKだろう!と思って試したけど、起動する度にparent属性が消失してダメでした。

しょうがないので、AppCode側でEclipse (Mac OS X)をコピーして独自設定を加えています(そんなに数が多くなかったので妥協・・・)。

まとめ

結論から言うと、シームレスな移行をするというのは難しい。恐らくカスタムの元となったデフォルトキーマップにも依存するはずで、AppCodeにもデフォルトで存在するVimEmacsベースであればうまくいくのではないかという気がします。

あとは、IDEで使いまわす前提であれば、デフォルトをコピーして作らないのがトラブらなくて良いかと。

というわけで、もっと良い方法があれば教えて下さい。