Question

J'ai récemment créé pas mal de plugins/extraits/etc de Sublime Text 3.pour automatiser les tâches répétitives.L'actuel sur lequel je suis bloqué utilise l'expression régulière dans un extrait pour obtenir mon squelette par défaut pour une nouvelle fonction.

Idéalement, j'aimerais que l'extrait génère quelque chose de similaire à :

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

Jusqu'à présent, je peux le formater avec 1 argument ou plusieurs arguments, pas toutes les combinaisons possibles (zéro, un, plusieurs).

Le plan est actuel, je dois juste comprendre le deuxième ${2} avec expression régulière :

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

Un argument :

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

Beaucoup d'arguments (avec 1 argument, cela montre "a: " + a + a):

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

Une méthode utilisée avait un supplément + "" + là-dedans, ce que j'aimerais éviter :

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

J'ai essayé une anticipation conditionnelle basée sur des virgules, mais cela est gâché > 1 argument, probablement à cause de mon manque de compréhension :

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

Je pourrais facilement le faire via un plugin normal (c'est facile par programmation), mais idéalement, cela peut rester un extrait/complétion de code puisque je peux simplement remplacer la complétion de code "amusante" JS.

Qu'est-ce qui me manque pour y parvenir (ou est-ce simplement la mauvaise voie - si tel est le cas, j'aimerais quand même en savoir plus sur les regex) ?

Était-ce utile?

La solution

J'ai enfin compris cela, il existe une option de remplacement conditionnel :

?n:then:else

Le format final ressemble donc à :

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

Ce qui donnera le résultat souhaité :

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top