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

関数ポップアップ

最後に関数ポップアップの定義について紹介します。Xcodeではソースコード内の特定のシンボルを関数ポップアップとして選択できるようになっています。

関数ポップアップは、構文タイプで定義し、構文にマッチした文字列がポップアップメニューに表示されます。

{
    Identifier = "my.lang.sample.popup";
    Syntax = {
        Words = ( "Popup" );
        Type = "xcode.syntax.definition.function";
    };
},

関数ポップアップを定義する構文タイプには以下のようなものが用意されています。

構文タイプ 用途
xcode.syntax.definition.function 関数の定義
xcode.syntax.declaration.function 関数の宣言
xcode.syntax.definition.method メソッドの定義
xcode.syntax.declaration.method メソッドの宣言
xcode.syntax.declaration.property プロパティーの宣言
xcode.syntax.typedef 型の定義
xcode.syntax.definition.class クラスの定義
xcode.syntax.declaration.class クラスの宣言
xcode.syntax.definition.macro マクロの定義
xcode.syntax.mark マーク(#pragma mark
xcode.syntax.name.partial 一部の文字列だけをポップアップする

関数ポップアップは、文法的に入れ子になるように定義されていれば、入れ子になったシンボルがインデントされます。

しかし、基本的に構文にマッチした全ての文字列がポップアップされるため、単純に入れ子を定義しただけでは、期待どおりの結果が得られません。

{
    Identifier = "my.lang.sample.function";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Rules = (
            "function",
            "my.lang.sample.keyword",
            "my.lang.sample.function.args",
            "my.lang.sample.function.block"
        );
        Type = "xcode.syntax.definition.function";
    };
},

{
    Identifier = "my.lang.sample.function.args";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Start = "(";
        End = ")";
        Recursive = YES;
    };
},

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

このようなときは、"xcode.syntax.name.partial"を使って、構文にマッチした文字列のうち、一部の文字列だけをポップアップさせることができます。

{
    Identifier = "my.lang.sample.function";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Rules = (
            "my.lang.sample.function.def",
            "my.lang.sample.function.block"
        );
        Type = "xcode.syntax.definition.function";
    };
},

{
    Identifier = "my.lang.sample.function.def";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Rules = (
            "function",
            "my.lang.sample.function.name"
        );
    };
},

{
    Identifier = "my.lang.sample.function.name";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Rules = (
            "my.lang.sample.keyword",
            "my.lang.sample.function.args",
        );
        Type = "xcode.syntax.name.partial";
    };
},

{
    Identifier = "my.lang.sample.function.args";
    Syntax = {
        Tokenizer = "my.lang.sample.lexer";
        Start = "(";
        End = ")";
        Recursive = YES;
    };
},

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

構文タイプ"xcode.syntax.definition.function"を設定した構文定義Rulesの第一要素の中から(今回の例では"my.lang.sample.function.def"の中から)、"xcode.syntax.name.partial"が設定されている構文が検索され、それが"xcode.syntax.definition.function"として関数ポップアップに表示されます。

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