hibomaのはてなダイアリー このページをアンテナに追加 RSSフィード

 | 

2008::11::29

[] Xcodeマクロ2

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" );
        },
)

マクロのプロパティについて ざっくりと。

プロパティはKey/Value形式で定義する

  • Identifier ... マクロの識別子。
  • IsMenu ... Xcodeのメニューにマクロを表示するかどうか
  • IncludeContexts / ExcludeContexts ... マクロが有効/無効なコンテキスト(*後述)
  • TextString ... マクロで挿入する文字列
  • CompletionPrefix ... 例えば「hoge」と設定しておくと、「hoge」と入力しているときXcodeの補完候補に出てくれるようになる
  • BasedOn ... マクロの継承元。例えば「 BasedOn = objc」とするとIdentifierがobjcのプロパティを継承するようであります。
  • 「 Hoge = "hoge" 」というプロパティを定義すると、文字列内で $(Hoge)として参照する事ができる


Xcodeの「コンテキスト」

  • Xcodeはカーソルの位置によってコンテキストを決定している。以下のようなイメージ( Objective-Cの場合 )

/*
 * ここにカーソルがあると xcode.lang.commentコンテキスト
 */

- (void)someMessage
{
    // ここにカーソルがあると xcode.lang.objc.blockコンテキスト
}

  • マクロはコンテキストを判別して、入力補完候補として有効か無効かを決める事ができる

IncludeContextsにxcode.lang.objc.blockコンテキストをもつマクロは、カーソルがメソッドのブロック内(xcode.lang.objc.blockコンテキスト)にあるときに入力補完の候補になる。( 他にもいろんなコンテキストがある。)



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" );
        },

以下のようにして呼び出せます。

  • メニューから

f:id:hiboma:20081129191303p:image

  • 補完候補から

f:id:hiboma:20081129191304p:image


もうちょっと有用なマクロを作る

TextStringのプロパティに "<#! ... !#>" という文字列を挿入すると(...は任意の文字列)、プレースホルダとして展開されます。複雑なマクロを定義した時にプレースホルダを使うとよさげ


        {
            Identifier = objc.message;
            BasedOn = objc;
            IsMenuItem = YES;
            Name = "Method Snippet";
            CompletionPrefix = "m";
            TextString = "[<#!object!#> <#!message!#>]";
        },

のマクロは以下のように展開されます。

f:id:hiboma:20081129192904p:image

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

 |