Domanda

Ho recentemente creato alcuni plugin / snippet / ecc. per automatizzare compiti ripetitivi. L'attuale sono bloccato per usi Regex in uno snippet per ottenere il mio scheletro predefinito per una nuova funzione.

Idealmente, vorrei che lo snippet genererebbe qualcosa di simile a:

// 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();
}    
.

Finora, posso ottenerlo formattato con 1 argomento o molti argomenti, non tutti i combo possibili (zero, uno, molti).

Il contorno è attuale, ho solo bisogno di capire il secondo ${2} con 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>
.

One Arg:

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

Molti args (con 1 arg, questo mostra "a: " + a + a):

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

Un metodo ha funzionato con un + "" + extra in là, che vorrei evitare:

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

Ho provato un aspetto condizionale in base alle virgole, ma ciò viene incasinato> 1 ARG, probabilmente a causa della mia mancanza di comprensione di loro:

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

Potrei facilmente farlo tramite un plugin normale (questo è facile a livello programmatico), ma idealmente questo può rimanere uno snippet / codice-completamento da quando posso sovrascrivere il codice di codice "divertente" JS.

Cosa mi manca per realizzare questo (o è semplicemente il viale sbagliato - se è così, mi piacerebbe comunque sapere per saperne di più su Regex)?

È stato utile?

Soluzione

Alla fine ha capito questo, c'è un'opzione di sostituzione condizionale:

?n:then:else
.

Quindi il formato finale sembra:

<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>
.

che darà il risultato desiderato:

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();
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top