Reemplazo de expresiones regulares de fragmento sublime
-
20-12-2019 - |
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).
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();
}