Pregunta

Recientemente he estado creando bastantes complementos/fragmentos/etc. de Sublime Text 3.para automatizar tareas repetitivas.El actual en el que estoy atascado usa expresiones regulares en un fragmento para obtener mi esqueleto predeterminado para una nueva función.

Idealmente, me gustaría que el fragmento generara algo similar 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();
}    

Hasta ahora, puedo formatearlo con 1 argumento o muchos argumentos, no todas las combinaciones posibles (cero, uno, muchos).

El esquema está actualizado, solo necesito descubrir el segundo. ${2} con expresiones regulares:

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

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

Muchos argumentos (con 1 argumento, esto muestra "a: " + a + a):

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

Un método trabajado tenía un extra + "" + allí, que me gustaría evitar:

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

Intenté una anticipación condicional basada en comas, pero eso se estropea >1 arg, probablemente debido a mi falta de comprensión de ellas:

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

Podría hacer esto fácilmente a través de un complemento normal (esto es fácil mediante programación), pero idealmente esto puede seguir siendo un fragmento/compleción de código ya que puedo anular la finalización de código "divertida" de JS.

¿Qué me falta para lograr esto (o es simplemente el camino equivocado? Si ese es el caso, todavía me gustaría saber más sobre las expresiones regulares).

¿Fue útil?

Solución

Finalmente descubrí esto, hay una opción de reemplazo condicional:

?n:then:else

Entonces el formato final queda así:

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

Lo que dará el resultado deseado:

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top