2015-11-04 267 views
0

我已經爲特定語言創建了tmlanguage文件。這種語言允許在字符串中使用反斜槓,並且它不會逃避它們。所以當我創建變量時:SublimeText3防止在引用字符串中轉義反斜槓

Path ='C:\ Temp \';

Sublime認爲引號被轉義了,然後我的語法着色關閉了腳本的其餘部分。

我怎樣才能防止這種情況發生?

編輯:哎呀!如果你還沒有使用PackageDev和語言發展的YAML-tmLanguage格式忘記源(感謝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> 
+0

您必須有一個正則表達式才能將反斜槓字母組合解釋爲轉義序列。除去那個,你就全都定了。雖然... – MattDMo

+0

好吧,我更新了與源的帖子...我剛剛刪除了關鍵字項目(這有點太長)。 – user3072517

+0

根據我的理解,你需要替換'\\(x \ h {2} | [0-2] [0-7] {,2} | 3 [0-6] [0-7] | 37 [ '| \\(x \ h {2} | [0-2] [0-7] {,2} | 3 [0-7]?| [4-7] [0-7] 0-6] [0-7] | 37 [0-7]?| [4-7] [0-7]?| [^'「])。 –

回答

0

,你真的應該是。這裏是所有您發佈的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]?|.) 

匹配反斜槓後跟一堆選項(由|字符分隔),其中最後的是.。這是什麼導致你的問題 - .匹配任何字符(除了換行符),所以你的正則表達式本質上是說「匹配一個反斜槓後面是任何這些組合,包括反斜槓後跟任何單個字符。」只需在每個正則表達式的末尾擺脫,你就會好起來的。

作爲一個側面說明,你真的應該使用一個存儲庫用於保存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

+0

感謝MattDMo對您的深入解答和建議我還沒有看過YAML語言......我現在就要這樣做!再次感謝! – user3072517