Xcodeのテキストマクロについて、分かったことをざっくりと書きます。
サンプル Objective-Cのマクロの場合
- /Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro
(
//
// Objective-C language macros (they also show up for Objective-C++)
//
{
Identifier = objc;
Name = "Objective C";
IsMenu = YES;
// Can be set (for all languages) with the XCCodeSenseFormattingOptions user default
// DefaultSettings = {
// PreExpressionsSpacing = " ";
// InExpressionsSpacing = "";
// BlockSeparator = " ";
// PostBlockSeparator = "\n";
// };
IncludeContexts = ( "xcode.lang.objc" );
ExcludeContexts = ( "xcode.lang.string", "xcode.lang.character", "xcode.lang.comment", "xcode.lang.c.preprocessor" );
},
{
Identifier = objc.log;
BasedOn = objc;
IsMenuItem = YES;
Name = "NSLog() Call";
TextString = "NSLog$(PreFunctionArgsSpacing)($(InFunctionArgsSpacing)@\"<#message#>\"$(InFunctionArgsSpacing));";
CompletionPrefix = log;
IncludeContexts = ( "xcode.lang.objc.block" );
},
)
- 拡張子 .. xctxtmacro
- Key/Value形式
- 他のマクロを継承できる
- ブレース { } の中にマクロの定義を書いていく
マクロのプロパティについて ざっくりと。
プロパティはKey/Value形式で定義する
- Identifier ... マクロの識別子。
- Name ... Xcodeのメニュー欄に表示する文字列
- IsMenu ... Xcodeのメニューにマクロを表示するかどうか
- IncludeContexts / ExcludeContexts ... マクロが有効/無効なコンテキスト(*後述)
- TextString ... マクロで挿入する文字列
- BasedOn ... マクロの継承元。例えば「 BasedOn = objc」とするとIdentifierがobjcのプロパティを継承するようであります。
- DefaultSettings ... ??変数のデフォルト定義??
Xcodeの「コンテキスト」
- Xcodeはカーソルの位置によってコンテキストを決定している。以下のようなイメージ( Objective-Cの場合 )
/* * ここにカーソルがあると xcode.lang.commentコンテキスト */ - (void)someMessage { // ここにカーソルがあると xcode.lang.objc.blockコンテキスト }
- マクロはコンテキストを判別して、入力補完候補として有効か無効かを決める事ができる
IncludeContextsにxcode.lang.objc.blockコンテキストをもつマクロは、カーソルがメソッドのブロック内(xcode.lang.objc.blockコンテキスト)にあるときに入力補完の候補になる。( 他にもいろんなコンテキストがある。)
- 宿題
- ではコンテキストを決定づけるルールはどこで定義されてるのか?って話になるんですが、ここらへんを参考にして調査中
- http://code.google.com/p/xcode-coldfusion/source/browse/trunk/specifications/Specifications/?r=5
Hello,Worldマクロを作ろう
- 「 NSLog(@"Hello,World"); 」と入力するマクロを作りたい!
{
Identifier = objc.hello;
BasedOn = objc;
IsMenuItem = YES;
Name = "HelloWorld";
HelloString = "Hello,World!";
TextString = 'NSLog(@"$(HelloString)");';
CompletionPrefix = "hello";
IncludeContexts = ( "xcode.lang.objc.block" );
},
以下のようにして呼び出せます。
- メニューから
- 補完候補から


