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 = 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>