我试图在 TextMate 中突出显示自定义语言。但是,以下定义不会突出显示 PHP 插入:
{ scopeName = 'source.serpent';
fileTypes = ( 'serpent' );
patterns = (
{ begin = '<\?';
end = '\?>';
patterns = ( { include = 'source.php'; } );
},
);
}
原因何在?
更新
好吧,我太天真了,没想到上面的定义会引用 PHP 语言定义。显然,为了突出 PHP 插入,必须将 PHP 语言规则的很大一部分复制到新语言中。如果我想同时使用 Ruby 插入,那么就会变得非常混乱。
因此,我想问一下是否可以从我的新语言 (serpent) 定义中引用(而不是复制!)PHP 或 Ruby 定义。这样会更清楚,并减少重复。
更新2
显然,这只是 PHP 的问题。以下语言定义在我的文本中突出显示了 Ruby 和 Serpent 语言,但没有突出显示 PHP 插入!这到底是怎么回事?
{ scopeName = 'source.phpruby.serpent';
fileTypes = ( 'serpent', 'serpent.php', 'serpent.erb' );
patterns = (
{ begin = '<\?(php|=)?';
end = '\?>';
patterns = ( { include = 'source.php'; } );
},
{ begin = '<%';
end = '%>';
patterns = ( { include = 'source.ruby'; } );
},
{ include = 'source.serpent'; },
);
}
答案1
2010 年 7 月 9 日星期五 08:02,Allan Odgaard 写道:
我们使 PHP 语法本身与构造相匹配,因此对于您的语法,这些位已被包含语法所消耗,因此包含的 PHP 语法将成为无操作。
我们这样做的原因是,当 PHP 语法用作根语法时,它可以正常工作,因为尽管我们努力¹进行教育,但仍有很多用户坚持以这种方式使用它;)
¹ http://wiki.macromates.com/Troubleshooting/PHPSyntaxHighlight
在上帝的帮助下,我认识到了自己的错误,并做出了一个可行的定义(至少是突出显示!):
{ scopeName = 'source.phpruby.serpent';
fileTypes = ( 'serpent', 'serpent.php', 'serpent.erb' );
patterns = (
{ begin = '<\?(php|=|)';
end = '\?>';
include = 'source.php';
},
{ begin = '<%';
end = '%>';
patterns = ( { include = 'source.ruby'; } );
},
{ include = 'source.serpent'; },
);
}