トップページ > ドキュメント > 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"として関数ポップアップに表示されます。