Pergunta

Eu recentemente foi a criação de muito poucos Sublime Texto 3 plugins/snippets/etc.para automatizar tarefas repetitivas.O atual eu estou preso nos usa expressões regulares em um trecho de chegar o meu padrão de esqueleto para uma nova função.

Idealmente, eu gostaria que o fragmento poderia gerar algo semelhante 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();
}    

Até agora, eu posso obter formatado com 1 argumento ou muitos argumentos, não todas as possíveis combinações (zero, um, de muitos).

A estrutura atual é isso, eu só preciso descobrir o segundo ${2} com 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>

Um Argumento:

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

Muitos Args (com 1 arg, isso mostra "a: " + a + a):

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

Um método trabalhou por tinha um extra + "" + lá, o que eu gostaria de evitar:

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

Eu tentei uma condicional de look-ahead com base em vírgulas, mas que fica confuso >1 arg, provavelmente devido à minha falta de entendimento deles:

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

Eu poderia fazer isso facilmente através de uma normal plugin (isso é fácil através de programação), mas o ideal é que isso permaneça como um snippet de código-conclusão desde que eu pode apenas substituir o JS "diversão" código-conclusão.

O que é que estou em falta para fazer isso (ou é simplesmente errado avenue - se for esse o caso, eu ainda gostaria de saber para aprender mais sobre regex)?

Foi útil?

Solução

Finalmente descobriu isso, há uma condição, a opção de substituição:

?n:then:else

Assim, o formato final se parece com:

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

O que dará o resultado desejado:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top