0

私は、WoW Bundle for Visual Studio Codeの作成者兼メンテナーです。

Blizzard の World of Warcraft 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>

もちろん、これらのブロックは 2 つ (一重引用符用、二重引用符用) あり、通常の文字列ブロックの前に宣言して、それらが優先されるようにします。

それで、これはうまくいきます...ほとんど。

次のような宣言で:

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

または、さらに悪いことに:

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

明らかにすべきではない場合でも、文字列全体が有効として解析されます (レポFrameからの単語が含まれているため)。#string-parameters

リポジトリから、スペースを入れずに 1 つの単語のみが一致するようにするにはどうすればよいですか? 多くの方法で正規表現を変更しようとしましたが、役に立ちませんでした。

4

1 に答える 1

0

ここに誤解があると思います。ルールは、定義された順序で照合されます。後のルールは、前のルールと同じ文字列 (部分) に一致する場合、既存のスタイルをオーバーライドします。したがって、より一般的なルール (文字列ルール) が最初に来て、その後にキーワード ルールの色付けが来るように、ルールの順序を変更してみてください。

ところで、XML よりもはるかに読みやすい JSON を使用してルールを定義することもできることをご存知でしたか? たとえば、こちらの構文ファイルを参照してください。

于 2016-10-16T09:37:07.987 に答える