【问题标题】:SublimeText3 prevent backslash from escaping in quoted stringsSublimeText3 防止反斜杠在引用的字符串中转义
【发布时间】:2015-11-04 18:29:35
【问题描述】:

我已经为一种特殊语言创建了一个 tmlanguage 文件。该语言允许在字符串中使用反斜杠,并且不会转义它们。所以当我创建变量时:

路径 = 'C:\Temp\';

Sublime 认为引号被转义,然后我的语法着色在脚本的其余部分关闭。

我怎样才能防止这种情况发生?

编辑:哎呀!忘记来源(感谢 MattDMo)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>fileTypes</key>
    <array>
        <string>txt</string>
    </array>
    <key>name</key>
    <string>TM1</string>
    <key>patterns</key>
    <array>
        <dict>
            <key>match</key>
            <string>(=|&lt;&gt;|&gt;|&lt;|@=|@&lt;&gt;|@&gt;|@&lt;)</string>
            <key>name</key>
            <string>keyword.operator.tm1</string>
        </dict>     
        <dict>
            <key>match</key>
            <string>(?i)\b(If|While|Else|ElseIf|End|EndIf)\b</string>
            <key>name</key>
            <string>keyword.control.tm1</string>
        </dict> 
        <dict>
            <key>begin</key>
            <string>'</string>
            <key>beginCaptures</key>
            <dict>
                <key>0</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.begin.tm1</string>
                </dict>
            </dict>
            <key>end</key>
            <string>'</string>
            <key>endCaptures</key>
            <dict>
                <key>0</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.end.tm1</string>
                </dict>
            </dict>
            <key>name</key>
            <string>string.quoted.single.tm1</string>
            <key>patterns</key>
            <array>
                <dict>
                    <key>match</key>
                    <string>\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)</string>
                    <key>name</key>
                    <string>constant.character.escape.tm1</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>begin</key>
            <string>"</string>
            <key>beginCaptures</key>
            <dict>
                <key>0</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.begin.tm1</string>
                </dict>
            </dict>
            <key>end</key>
            <string>"</string>
            <key>endCaptures</key>
            <dict>
                <key>0</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.string.end.tm1</string>
                </dict>
            </dict>
            <key>name</key>
            <string>string.quoted.double.tm1</string>
            <key>patterns</key>
            <array>
                <dict>
                    <key>match</key>
                    <string>\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)</string>
                    <key>name</key>
                    <string>constant.character.escape.tm1</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>captures</key>
            <dict>
                <key>1</key>
                <dict>
                    <key>name</key>
                    <string>punctuation.definition.comment.tm1</string>
                </dict>
            </dict>
            <key>match</key>
            <string>(#).*$\n?</string>
            <key>name</key>
            <string>comment.line.double-slash.tm1</string>
        </dict>
        <dict>
            <key>match</key>
            <string>\;</string>
            <key>name</key>
            <string>punctuation.terminator.statement.tm1</string>
        </dict>
    </array>
    <key>scopeName</key>
    <string>source.tm1</string>
</dict>
</plist>

【问题讨论】:

  • 您必须有一个正则表达式,它会导致反斜杠字母组合被解释为转义序列。删除它,你就准备好了。但是,如果没有看到您的来源,很难进一步提供帮助......
  • 好的,我用源更新了帖子...我刚刚删除了关键字项目(它有点太长了)。
  • 据我了解,您需要将\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.) 替换为\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|[^'"])

标签: regex sublimetext3 tmlanguage


【解决方案1】:

如果您还没有使用 PackageDev 及其 YAML-tmLanguage 格式进行语言开发,那么您真的应该使用。以下是您发布的所有 XML 的样子:

# [PackageDev] target_format: plist, ext: tmLanguage
name: TM1
scopeName: source.tm1
fileTypes: [txt]

patterns:
- name: keyword.operator.tm1
  match: (=|<>|>|<|@=|@<>|@>|@<)

- name: keyword.control.tm1
  match: (?i)\b(If|While|Else|ElseIf|End|EndIf)\b

- name: string.quoted.single.tm1
  begin: ''''
  beginCaptures:
    '0': {name: punctuation.definition.string.begin.tm1}
  end: ''''
  endCaptures:
    '0': {name: punctuation.definition.string.end.tm1}
  patterns:
  - name: constant.character.escape.tm1
    match: \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)

- name: string.quoted.double.tm1
  begin: '"'
  beginCaptures:
    '0': {name: punctuation.definition.string.begin.tm1}
  end: '"'
  endCaptures:
    '0': {name: punctuation.definition.string.end.tm1}
  patterns:
  - name: constant.character.escape.tm1
    match: \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)

- name: comment.line.double-slash.tm1
  match: (#).*$\n?
  captures:
    '1': {name: punctuation.definition.comment.tm1}

- name: punctuation.terminator.statement.tm1
  match: \;

一旦我把它放在这种格式中,问题马上就跳出来了:它与你的两个 string.quoted 部分中的 constant.character.escape.tm1 部分有关。正则表达式:

\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)

匹配一个反斜杠后跟一堆选项(由|字符分隔),最后一个是.。这就是导致您的问题的原因 - . 匹配任何字符(换行符除外),因此您的正则表达式本质上是在说 “匹配反斜杠后跟任何这些组合,包括反斜杠后跟任何单个字符。” em> 只需在每个正则表达式的末尾去掉|.,就可以了。

附带说明,您确实应该使用存储库来保存constant.character.escape.tm1 范围:

- name: string.quoted.double.tm1
  begin: '"'
  beginCaptures:
    '0': {name: punctuation.definition.string.begin.tm1}
  end: '"'
  endCaptures:
    '0': {name: punctuation.definition.string.end.tm1}
  patterns:
  - include: '#constant_character_escape'

  (...)

repository:
  constant_character_escape:
    name: constant.character.escape.tm1
    match: \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?)

repository 部分应该(我相信)位于语言定义的末尾,因为这是我见过的唯一地方。使用这种模式,您基本上可以将定义分解为块并为其分配“变量名”,然后在需要时include

【讨论】:

  • 感谢 MattDMo 的深入解答和改进建议。我还没有看过 YAML 的语言……我现在就去做!再次感谢!
猜你喜欢
  • 2019-09-28
  • 2010-10-30
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多