Ich arbeite an einer Visual Studio Code-Erweiterung. Die Erweiterung soll auf den Text einwirken, der gerade im Editorfenster ausgewählt ist, und an einen externen Befehl senden (lein-cljfmt
in meinem Fall, aber ich denke, das hat nichts mit meiner Frage zu tun). Wenn der externe Befehl fertig ist, wird der Text verarbeitet, der den aktuellen Editorselektor durch das vom Befehlszeilenwerkzeug zurückgegebene Ergebnis ersetzen soll.Wie kann ich eine mehrzeilige Zeichenfolge, die Newline-Literale enthält, ordnungsgemäß entschlüsseln und nicht anzeigen?
Bevor die Zeichenfolge zu senden ich entkommen es wie folgt aus:
contents
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n');
Das Ergebnis in wird unescaped wie:
contents
.replace(/\\n/g, '\n')
.replace(/\\"/g, '"')
.replace(/\\\\/g, '\\');
Dies aber ein Fall in all arbeitet: wenn die Auswahl, die verarbeitet wird Enthält ein String-Literal, das ein Newline-Literal enthält, wird das Unescaping stattdessen in einen Zeilenumbruch umgewandelt, wodurch der Code im Editor aufgebrochen wird.
Dies ist ein Beispiel für ein Snippet, das mein Entkommen bricht:
(defn join
[a b]
(str a "\n" b))
Ich versuchte schon einige regexp schwarze Magie wie
.replace(/(?!\B"[^"]*)\\n(?![^"]*"\B)/g, '\n')
jetzt finden konnte, aber nicht eine Lösung, die funktioniert Randfälle nicht haben. Gibt es eine Möglichkeit, dies zu tun, die ich vermisse? Ich frage mich auch, ob es eine VSCode-Erweiterung API gibt, die damit umgehen könnte, da es ein allgemeines Szenario für mich zu sein scheint.
Danke für die Antwort, ich möchte dies für eine Weile offen halten, da vielleicht jemand kommt, der vielleicht weiß, ob dies mit den VSCode-APIs gemacht werden kann. – m90