0

我是WoW Bundle for Visual Studio Code的作者和维护者。

在暴雪的魔兽世界 API 中,许多常量,如事件名称、小部件脚本处理程序或某些函数参数都是字符串。这些字符串可以是单引号或双引号,其中一些(不是全部)不区分大小写。例如:

local myFrame = CreateFrame('Button', nil, UIParent)
myFrame:SetPoint('CENTER', 0, 0)
MyFrame:RegisterEvent('PLAYER_ENTERING_WORLD')
myFrame:SetScript('OnEvent', myEventHandler)

为了在我的 tmLanguage 文件中限定这些特殊字符串,我在存储库中声明它们:

<!-- This is only an excerpt, there are many more of these :) -->
<key>repository</key>
<dict>
    <key>string-parameters</key>
    <dict>
        <key>match</key>
        <string>(?i)(Button|Frame|Slider|StatusBar|TOP|LEFT|BOTTOM|RIGHT|BACKGROUND|ARTWORK|LOW|MEDIUM|HIGH)</string>
        <key>name</key>
        <string>support.constant.wow.parameter.lua</string>
    </dict>
    <key>event-names</key>
    <dict>
        <key>match</key>
        <string>(PLAYER_ENTERING_WORLD|ADDON_LOADED)</string>
        <key>name</key>
        <string>support.constant.wow.event.lua</string>
    </dict>
    <key>script-handlers</key>
    <dict>
        <key>match</key>
        <string>(OnLoad|OnShow|OnEvent)</string>
        <key>name</key>
        <string>support.constant.wow.hander.lua</string>
    </dict>
</dict>

我将它们包括在一个周围的范围内:

<dict>
    <key>name</key>
    <string>support.constant.wow.quoted.single.lua</string>
    <key>begin</key>
    <string>'</string>
    <key>beginCaptures</key>
    <dict>
        <key>0</key>
        <dict>
            <key>name</key>
            <string>punctuation.definition.constant.begin.lua</string>
        </dict>
    </dict>
    <key>end</key>
    <string>'</string>
    <key>endCaptures</key>
    <dict>
        <key>0</key>
        <dict>
            <key>name</key>
            <string>punctuation.definition.constant.end.lua</string>
        </dict>
    </dict>
    <key>patterns</key>
    <array>
        <dict>
            <key>include</key>
            <string>#string-parameters</string>
        </dict>
        <dict>
            <key>include</key>
            <string>#event-names</string>
        </dict>
        <dict>
            <key>include</key>
            <string>#script-handlers</string>
        </dict>
    </array>
</dict>

当然,我有两个这样的块(一个用于单引号,一个用于双引号),它们在常规字符串块之前声明以确保它们优先。

所以,这工作......几乎。

在如下声明中:

local myFrame = CreateFrame(' Frame ', nil, UIParent)  -- Notice the spaces around Frame

或者,更糟糕的是:

local myFrame = CreateFrame('Frame Type That Does Not Exist', nil, UIParent)

整个字符串仍然被解析为有效(因为它包含Frame来自#string-parametersrepo 的单词),而它显然不应该。

如何确保仅匹配存储库中的一个单词,周围没有空格?我尝试以多种方式修改正则表达式,但无济于事。

4

1 回答 1

0

我相信这里有一个误解。规则按照它们定义的顺序进行匹配,如果后面的规则与前面的规则匹配相同的字符串(部分),则后面的规则会覆盖现有样式。因此,请尝试重新排序您的规则,以便首先出现更通用的规则(字符串规则),然后是关键字规则的着色。

顺便说一句,你知道你也可以使用 JSON 来定义你的规则,这比 XML 更容易阅读吗?例如在这里查看我的语法文件

于 2016-10-16T09:37:07.987 回答