我为专门语言创建了一个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>(=|<>|>|<|@=|@<>|@>|@<)</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>
答案 0 :(得分:0)
如果您尚未使用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: \;
一旦我将其置于此格式中,问题就会立即跳出:它与您的两个constant.character.escape.tm1
部分中的string.quoted
部分一致。正则表达式:
\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)
匹配反斜杠后跟一堆选项(由|
字符分隔),最后一个是.
。这就是造成问题的原因 - .
匹配任何字符(换行符除外),因此你的正则表达式基本上是说“匹配反斜杠后跟任何这些组合,包括反斜杠后跟任何单个字符。” 在每个正则表达式的末尾摆脱|.
,你会没事的。
作为旁注,您确实应该使用存储库来保存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
。