我使用Sublime Text 3作为PHP编辑器,我一直在自定义PHP.tmLanguage文件以包含更多语法范围,现在我无法弄清楚如何捕获类方法调用。
$html = new HTML("hr");
$html->output_ml("moo");
output_ml 目前被声明为范围 variable.other.property.php 我想添加一个专门用于类方法调用的范围,但是我在tmLanguage文件中定义正则表达式时遇到了问题。
我试过
<dict>
<key>match</key>
<string>(?i)\$[a-z_][a-z0-9_]*->([a-z_][a-z_0-9]*)\s*\(</string>
<key>name</key>
<string>meta.method-call.php</string>
</dict>
答案 0 :(得分:1)
你非常接近,我只是调整了一些东西:
(?i:(?!\$[a-z_][a-z0-9_]*->)([a-z_][a-z_0-9]*)\s*\()
我做的第一件事是将整个表达式包装在&#34;不区分大小写的&#34;修饰符,所以没有错过任何东西。可能没必要,但无论如何。其次,更重要的是,我把你的第一组在括号之外,并使它们成为负面的前瞻。通过这种方式,它们与班级名称和箭头相匹配,但不报告它 - 基本上说&#34;匹配我们前面的任何东西,只要我们存在于它前面,但不匹配我们&#34;
现在,您的范围只与方法的名称相匹配。
现在,这是我不能得到的 - 为什么你应该这样做。我同时保留了language syntax和color scheme,所以我在Sublime Text和TextMate中有很多经验。据我所知,PHP .tmLanguage
已经包含了函数调用的范围。我不是任何PHP专家,但我知道基础知识,所以我做了三个不同PHP函数调用的例子:
Green强调了各种语言的各种函数调用。在上面的示例中,baz_quux
的范围为meta.function-call.object.php
,在中间示例中为meta.function-call.static.php
,而在底部则为meta.function-call.php
。我不明白你从variable.other.property.php
获得的地方。
但是,如果我在上面的函数调用后删除了括号:
我从上到下得到以下范围:variable.other.property.php
( aha! ),constant.other.class.php
和constant.other.php
。如果我把parens放回去,并在函数名结尾后添加一个或三个空格,它们仍然以绿色突出显示为函数。
所以,虽然今天我们对正则表达式有一些乐趣,但最终你的工作已经完成了。如果您要进行更多范围搜索,我强烈推荐使用ScopeAlways
插件,就像其名称所暗示的那样,它始终列出底部栏中当前光标位置的完整范围(您可以如果你愿意,可以通过Command Palette关闭它。如果我要求扩展我的配色方案并突出显示为一种新语言,我只需打开尽可能多的代码,然后用鼠标查看,查看不同的范围,然后编辑我的主题以更正根据需要添加颜色,或为全新范围添加新颜色。我然后扫描.tmLanguage
文件(在converting it to YAML之后),看看我是否遗漏了任何内容。
祝你工作顺利!