トップページ > ドキュメント > 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を設定しても実現することができます。こうすると、その構文定義が再帰的に処理されるようになります。