Frage

Ich habe in letzter Zeit einige Sublime Text 3-Plugins/Snippets usw. erstellt.um sich wiederholende Aufgaben zu automatisieren.Der aktuelle Code, an dem ich feststecke, verwendet Regex in einem Snippet, um mein Standardgerüst für eine neue Funktion zu erhalten.

Im Idealfall möchte ich, dass das Snippet etwas Ähnliches generiert:

// Multiple Args (one arg would obviously look like (..." + "a: " + a + ")");)
function Foo(a, b, c)
{
    Log.AppendFolder("Foo(" + "a: " + a + ", b: " + b + ", c: " + c + ")");
        //body
    Log.PopLogFolder();
}
// Zero Args
function Foo()
{
    Log.AppendFolder("Foo()");
        //body
    Log.PopLogFolder();
}    

Bisher kann ich es mit einem oder mehreren Argumenten formatieren, nicht mit allen möglichen Kombinationen (null, eins, viele).

Die Gliederung ist aktuell, ich muss nur noch die zweite herausfinden ${2} mit Regex:

<snippet>
<content><![CDATA[
function ${1:function_name}(${2:arguments})
{
    Log.AppendFolder("$1(" + ${2/(?#stuck here)//} + ")");
        ${3://body}
    Log.PopLogFolder();
}$0]]></content>
    <tabTrigger>fun</tabTrigger>
    <scope>source.js</scope>
    <description>Function Template</description>
</snippet>

Ein Argument:

"$1(" + ${2/^([A-z0-9_-]*),?.*/"\1\: " + \1 + /}");"

Viele Argumente (mit 1 Argument, das zeigt "a: " + a + a):

"$1(" + ${2/^([A-z0-9_-]*),?(.*)/"\1\: " + \1 + /}${2/([A-z0-9_-]*)(?:, *([A-z0-9_-]*))/"$2\: " + $2 + /g}");"

Eine Methode, mit der gearbeitet wurde, hatte ein Extra + "" + drin, was ich gerne vermeiden würde:

${2/([A-z_0-9]+)((?:, ?)?)/"\1\: " + \1 + "\2" + /g}

Ich habe einen bedingten Look-Ahead versucht, der auf Kommas basiert, aber das geht >1 arg durcheinander, wahrscheinlich weil ich sie nicht verstehe:

${2/(?(?!,)^([A-z0-9_-]*)$|([A-z0-9_-]*), *)/"\1\: " + \1/g}

Ich könnte dies problemlos über ein normales Plugin tun (das ist programmgesteuert einfach), aber im Idealfall kann dies ein Snippet/Code-Vervollständigung bleiben, da ich die „lustige“ Code-Vervollständigung von JS einfach überschreiben kann.

Was fehlt mir, um dies zu erreichen (oder ist es einfach der falsche Weg – wenn das der Fall ist, würde ich trotzdem gerne mehr über Regex erfahren)?

War es hilfreich?

Lösung

Endlich herausgefunden, gibt es eine bedingte Ersetzungsoption:

?n:then:else

Das endgültige Format sieht also so aus:

<snippet>
    <content><![CDATA[
function ${1:function_name}(${2:args})
{
    Log.AppendFolder("$1(${2/.+/" + /}${2/([A-z_0-9-]+) *(,)? */"$1\: " + $1 ?2: + "$2 " + :+ /g}${2/.+/"/})");
       ${3:// body...}
    Log.PopLogFolder();
}$0]]></content>
    <tabTrigger>fun</tabTrigger>
    <scope>source.js</scope>
    <description>Function</description>
</snippet>

Was zum gewünschten Ergebnis führt:

function function_name()
{
    Log.AppendFolder("function_name()");
       // body...
    Log.PopLogFolder();
}

function function_name(a)
{
    Log.AppendFolder("function_name(" + "a: " + a + ")");
       // body...
    Log.PopLogFolder();
}

function function_name(a, b)
{
    Log.AppendFolder("function_name(" + "a: " + a  + ", " + "b: " + b + ")");
       // body...
    Log.PopLogFolder();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top