2016-07-24 28 views
0

Durch die Verwendung von Kommentaren in JSON-Konfigurationsdateien in Sublime Text können JSON-Objekte nicht dekodiert werden. Hier ist meine Geschichte.Warum erlaubt Sublime Text 3 Kommentare in JSON-Konfigurationsdateien?

Ich habe SublimeREPL Plugin in meinem Sublime Text 3 neu installiert. Bald stellte ich fest, dass Python2.7 statt 3.5 standardmäßig ausgeführt wurde. Daher fügte ich eigene Python3.5-Konfigurationsdateien entsprechend hinzu, um Python3.5 zu unterstützen.

Meine Packages/SublimeREPL/config/Python3.5/Main.sublime-menu JSON-Konfigurationsdatei sieht wie folgt aus:

[ 
{ 
    "id": "tools", 
    "children": 
    [{ 
     "caption": "SublimeREPL", 
     "mnemonic": "R", 
     "id": "SublimeREPL", 
     "children": 
     [ 
      {"caption": "Python3.5", 
      "id": "Python3.5", 

      "children":[ 
       {"command": "repl_open", 
       "caption": "Python3.5", 
       "id": "repl_python3.5", 
       "mnemonic": "P", 
       "args": { 
        "type": "subprocess", 
        "encoding": "utf8", 
        "cmd": ["python3", "-i", "-u"], 
        "cwd": "$file_path", 
        "syntax": "Packages/Python/Python.tmLanguage", 
        "external_id": "python3", 
        "extend_env": {"PYTHONIOENCODING": "utf-8"} 
        } 
       }, 
       // run files 
       {"command": "repl_open", 
       "caption": "Python3.5 - RUN current file", 
       "id": "repl_python3.5_run", 
       "mnemonic": "R", 
       "args": { 
        "type": "subprocess", 
        "encoding": "utf8", 
        "cmd": ["python3", "-u", "$file_basename"], 
        "cwd": "$file_path", 
        "syntax": "Packages/Python/Python.tmLanguage", 
        "external_id": "python3", 
        "extend_env": {"PYTHONIOENCODING": "utf-8"} 
        } 
       } 
      ]} 
     ] 
    }] 
}] 

Hinweis gibt ein Kommentar // ausführen, um Dateien in dieser Datei. Diese Konfiguration funktioniert gut aus der Menüleiste Werkzeuge-> SublimeREPL-> Python3.5. Allerdings, wenn ich versuche, die Taste F5, um mit repl_python3.5_run zu binden, einem leichteren Zugang zu 3,5 zu haben, wurde die folgende Ausnahme in der Konsole geworfen:

Traceback (most recent call last): 

    File "./python3.3/json/decoder.py", line 367, in raw_decode 
StopIteration 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 

File "/opt/sublime_text/sublime_plugin.py", line 551, in run_ 
    return self.run(**args) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 32, in run 
    json_cmd = self._find_cmd(id, path) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 41, in _find_cmd 
    return self._find_cmd_in_file(id, file) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 53, in _find_cmd_in_file 
    data = json.loads(bytes) 

File "./python3.3/json/__init__.py", line 316, in loads 

File "./python3.3/json/decoder.py", line 351, in decode 

File "./python3.3/json/decoder.py", line 369, in raw_decode 

ValueError: No JSON object could be decoded 

Nachdem ich die // lief Dateien Kommentar entfernt. Die F5-Taste funktioniert einwandfrei. Es ist genau der Kommentar, der das Problem verursacht. Sublime Text verwendet JSON als Konfigurationsdateien, viele Konfigurationsdateien kommen mit // style Kommentaren. Wie wir wissen, werden Kommentare von JSON per Design entfernt.

Dann, wie kann erhabener Text Kommentare in Konfigurationsdateien erlauben, ist es mit einer Pipe? Wenn ja, wie kann meine Schlüsselanbindung fehlschlagen?

+1

** P LEASE NICHT TEXT als Bilder **. Kopieren Sie den Text und fügen Sie ihn in Ihre Frage ein. Bilder sind nicht durchsuchbar und können von Bildschirmlesegeräten nicht für Personen mit Sehbehinderungen interpretiert werden. Verwenden Sie den Link [Bearbeiten], um Ihre Frage zu ändern. Weitere Informationen finden Sie unter [this] (http://meta.stackoverflow.com/a/285557/1426065). – MattDMo

+0

Sie haben Recht.Ich habe meinen Fehler bereits korrigiert.Vielen Dank, dass Sie darauf hingewiesen haben. @ MattDMo – Naomi

Antwort

2

Sublime selbst (das Kernprogramm, nicht Plugins wie SublimeREPL) verwendet eine interne JSON-Bibliothek für das Parsen von Konfigurationsdateien wie .sublime-settings, .sublime-menu, .sublime-build usw. Diese (höchstwahrscheinlich angepasst) Parser Kommentare erlaubt.

Plugins werden jedoch durch eine Version von Python (derzeit 3.3.6 für die Entwicklerversionen) ausgeführt, die mit der ausführbaren Datei Sublime plugin_host verknüpft ist. Jedes Plugin, das die Standard-Bibliothek json Modul importiert (wie run_existing_command.py hat die Beschränkungen dieses Moduls zu gehorchen, und das schließt Fehler JavaScript-Stil Kommentare wie // in JSON zu erkennen.

Eine Abhilfe dazu wäre ein importieren externes Modul wie commentjson, das verschiedene Arten von Kommentaren löscht, einschließlich //, bevor die Daten an das Standardmodul json übergeben werden.Da es sich um ein reines Python-Modul handelt, können Sie einfach das Verzeichnis source in das Hauptverzeichnis von SublimeREPL kopieren und dann run_existing_command.py entsprechend bearbeiten - ändern Sie die Linie 6 zu import commentjson as json und Sie sind fertig

+0

In ST3 können Sie auf die interne Bibliothek zugreifen und eine json-Zeichenkette mit der Funktion 'sublime.decode_value (string)' dekodieren. –

+0

@r-stein interessant, ich habe diese Funktion noch nie zuvor angeschaut. Leider scheint SublimeREPL vor einiger Zeit aufgegeben worden zu sein, und obwohl es immer noch gut funktioniert, sind die Chancen für neue Features oder Bugfixes zwischen schlank und keine. – MattDMo

+0

Danke. Es klingt wie eine interessante Lösung. Ich werde es versuchen. @MattDMo – Naomi