Xcodeのキーバインドを深追いする

Xcodeキーバインドセットは「環境設定」の中から変更する事ができます。独自のカスタマイズをする場合は既存のキーバインドセットを複製して、複製した定義ファイルに手を加えていくことになります。



xcode_emacsというキーバインドセットを複製した場合、

 ~/Library/Application\ Support/Xcode/Key\ Bindings/xcode_emacs.pbxkeys


キーバインドを定義するXMLがコピーされています。(環境: Xcode3.0)
Xcodeの「環境設定」でもそれなりのカスタマイズができます。が、XMLファイルを直接いじることで「環境設定」だけではできないカスマイズも可能になります。Emacs厨な人はこのエントリの続きが参考になると思います。

*.pbxkeysの中身


複製したキーバインド定義のファイルをプロパティリストエディタ(/Developer/Applications/Utilities/Property\ List\ Editor.app/)で開きます。(viなんかでもokだけど非印字文字が入ってて扱いにくいかも)

中身はRoot以下に「menu」と「text」という要素がぶら下がっている構造になっています。さらに

が定義されています。

例として「Ctrl + b」で「カーソルを一個前に移動」は下記のようにKey/String型のセットで定義されています。String型の値はセレクタになります。


<key>^b</key>
<string>moveBackward:</string>

Emacsの「C-x」みたいな、プレフィックスをもつキーバインドを追加する


Xcodeはデフォルトで Emacsでよく使われる「 C-x 」をプレフィックスに持つキーバインドが定義できるようになっています。(C-x C-f みたいなのがいける )

よりEmacs風にするために「C-c」をプレフィックスにするキーバインドを加えるには、「text」要素の子要素にDictionary型(dict)を追加します。


<key>^c</key>
<dict>
        <key>^c</key>
        <string>switchToCounterpartOfCurrentFile:</string>
</dict>

(サンプルは、「C-c C-c 」でヘッダとソースを交互に切り替えるキーバインドの定義 )


( * Xcodeの環境設定ではプレフィックスを追加する事はできないようです。)
( * Cocoaには精通してないので細かい理由がよく分からないんですが、「menu」の中には ツーストロークキーバインドは定義できないみたい。 )

テキストマクロのキーバインドを加える

テキストマクロのキーバインドを加えたい場合は以下のようになります。ポイントはIdentifierです。

  • Identifierがobc.log.extendというマクロは
    • textMacro_obj_log_extend セレクタとして扱われる


サンプルとして

        {
            Identifier = objc.log.extend;
            BasedOn = objc;
            IsMenuItem = YES;
            Name = "NSLog() Call";
            TextString = "NSLog$(PreFunctionArgsSpacing)($(InFunctionArgsSpacing)@\"%s <#message#>\"$(InFunctionArgsSpacing),__FUNCTION__,<#!args!#>);";
            CompletionPrefix = log;
            IncludeContexts = ( "xcode.lang.objc.block" );
        },

上記のようなマクロを定義した場合、プロパティリストエディタでは以下のように設定するとokです


<key>l</key>
<string>textMacro_objc_log_extend</string>