Xcodeに任意のショートカットを設定する

MacでMacアプリやiPhoneアプリを書く時にはXcodeを使っている方が多いと思います。
Appleがそれ用に用意しているIDEだけに便利なわけですが、部分的に不満もあります。


個人的には行の途中を編集した時に

  1. その行末に移動
  2. 改行

をしたかったんです。
TextMateでのCommand+Return相当の機能ですね。



それを実現したくていろいろと試してみたものの動作的には実現できましたが動作が遅かったので
ちょっと使いづらかったんです。
そしたら、SafariStandのHetimaさん別の解を教えてくれました。


注意
僕の場合はうまくいきましたが自己責任でお願いします。
開発環境がぶっ飛んでしまうとかなりイタイのでバックアップなど対策を取っておくことをおすすめします。

やってみる

~/Library/Application Support/Xcode/Key Bindings

このディレクトリの中にある
ほげほげ.pbxkeys
というファイルを任意のテキストエディタでで開きます。*1
pbxkeysファイルがない場合は自力で作成するか、Xcodeの環境設定のキーバインドで設定を複製・リネームすればたぶん大丈夫だと思います。



テキストエディタで編集する場合は改行コードなどに気をつけて下さい。
僕の場合、Returnキーで通常”確定 OR 決定”が動作するべきの所をCtrl+Return相当の動作をするようになってしまいました(汗)
PropertyListEditorで編集する場合にはそういった問題が起こりにくいと思います。
バックアップはお忘れ無く。
追記終わり



エディタで開くと一部文字化けをしている部分もありますが、そこはスルーで。


ファイル自体はMacユーザにはおなじみのplistファイルです。
menu階層とtext階層があります。アルファベット順にキーバインドが書かれています。
今回僕はtext階層に

<key>^m</key>
<array>
    <string>moveToEndOfParagraph:</string>
    <string>insertNewline:</string>
</array>


を追記しました。


修飾キーはこんな感じで書けばいいようです。
"@t" = Command-t
"^t" = Control-t
"~t" = Option-t
"@^T" = Command-Control-Shift-t
"~ " = Option-space
"$@Z" = Command-Shift-z


押すキーの大文字小文字は区別されます。
shiftキーの”$”を使わなくても、shiftキーを含んだキーバインドは文字を大文字にすれば良いのかもしれません。


割り当てられる機能は
NSResponder Class Reference
http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html


の中の”Responding to Action Messages”の中から使えるようです。*2


もしかしたらですが、

/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/PBXBindableTextActions.plist

に定義されてる物がキーバインドに使えるアクションのような気もします。
いくつかはNSResponderのメソッドにないものもあるみたいです。


arrayにアクションをいくつか書くと複数のアクションをひとつのキーバインドで使えるようになります。
僕が追加した物は
moveToEndOfParagraph: で”段落の最後にキャレットを移動”*3をして
insertNewline: で”改行”
というものです。

まとめ

この方法だとEmacsのような2ストロークのキーバインドも設定できます。
また、

~/Library/KeyBindings/DefaultKeyBinding.dict

を同様な方法で作成するとXcodeに限らず、グローバルに*4設定することが出来ます。

plistファイルの編集が面倒とはいえ比較的簡単なテキスト編集だけでキーバインディングを設定できるMacに感動しました。

環境

*1:TextMateとCotEditor、PropertyListEditorで開けることが確認済み

*2:一部?

*3:Ctrl+E相当

*4:SafariやCotEditorなどCocoa系アプリのみ