トップページドキュメント > Xcodeでの構文色付け定義

コードフォーカス

Xcode3.0の新機能の一つに、コードフォーカスがあります。/* コメント */{ ブロック }の左側のフォーカスリボンにカーソルを当てるとフォーカスされ、クリックすると折り畳まれます。

ある構文をコードフォーカスさせるには、FoldableキーにYESを設定します。これで、この構文にマッチしたテキストがフォーカスされるようになります。/* コメント */なんかは、これだけで簡単にできます。

{
    Identifier = "my.lang.sample.comment";
    Syntax = {
        Start = "/*";
        End = "*/";
        Foldable = YES;
        Type = "xcode.syntax.comment";
    };
},

しかし、{ ブロック }などの場合は、少し複雑になります。{ ブロック }は入れ子にできるので、/* コメント */と同様に、単純にFoldableキーにYESを設定しただけでは期待どおりの結果になりません。

上のように、"{"右カッコと"}"左カッコがうまく対応しないほか、{ ブロック }内のfunctionや数字の0が色付けされません。期待どおりの結果にするには以下のように構文定義します。

{
    Identifier = "my.lang.sample.block";
    Syntax = {
        IncludeRules = (
            "xcode.lang.comment",
            "xcode.lang.comment.singleline",
            "xcode.lang.string",
            "xcode.lang.character",
            "my.lang.sample.keyword",
            "xcode.lang.number",
            "my.lang.sample.block"
        );
        Start = "{";
        End = "}";
        Foldable = YES;
    };
},

トップレベルの構文定義で記述したIncludeRulesをここにも書きます。そして、このIncludeRulesの中に自分自身の識別子"my.lang.sample.block"を含めることで、入れ子になることを表現できます。

これで期待どおりの結果になりましたが、このような定義を書く度に、トップレベルと同じIncludeRulesを書くのは冗長です。このような時は、Tokenizerを使って、何度も使うIncludeRulesを再利用することができます。

まず、Tokenizerで再利用するIncludeRulesを一つの構文として定義します。

{
    Identifier = "my.lang.sample.lexer";
    Syntax = {
        IncludeRules = (
            "xcode.lang.comment",
            "xcode.lang.comment.singleline",
            "xcode.lang.string",
            "xcode.lang.character",
            "my.lang.sample.keyword",
            "xcode.lang.number"
        );
    };
},

あとは、Tokenizerで上記の構文を指定するだけで、その構文定義の中にTokenizerで示したIncludeRulesが追加されます。

{
    Identifier = "my.lang.sample";
    Name = "Sample";
    Description = "Sample Language Coloring";
    BasedOn = "xcode.lang.simpleColoring";
    IncludeInMenu = YES;
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        IncludeRules = (
            "my.lang.sample.block"
        );
        Type = "xcode.syntax.plain";
    };
},

{
    Identifier = "my.lang.sample.block";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Start = "{";
        End = "}";
        Foldable = YES;
        Recursive = YES;
    };
},

また、{ ブロック }の入れ子については、自身の識別子をIncludeRulesに含める他に、RecursiveキーにYESを設定しても実現することができます。こうすると、その構文定義が再帰的に処理されるようになります。

Copyright(C)2001-2010 STRIPE-NET. All Right Reserved.