Вопрос

Недавно я создал довольно много плагинов/фрагментов/и т. д. для Sublime Text 3.автоматизировать повторяющиеся задачи.Текущий вариант, на котором я застрял, использует регулярное выражение во фрагменте, чтобы получить скелет по умолчанию для новой функции.

В идеале я бы хотел, чтобы фрагмент генерировал что-то похожее на:

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

Пока что я могу отформатировать его с помощью одного аргумента или множества аргументов, а не всех возможных комбинаций (ноль, один, много).

Схема актуальна, мне просто нужно выяснить вторую ${2} с регулярным выражением:

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

Один аргумент:

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

Множество аргументов (с 1 аргументом это показывает "a: " + a + a):

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

Один из использованных методов имел дополнительный + "" + там, чего я хотел бы избежать:

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

Я попробовал условный просмотр на основе запятых, но он перепутался > 1 аргумент, вероятно, из-за моего непонимания их:

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

Я мог бы легко сделать это с помощью обычного плагина (это легко программно), но в идеале это может оставаться фрагментом/дополнением кода, поскольку я могу просто переопределить «забавное» завершение кода JS.

Чего мне не хватает для этого (или это просто неправильный путь - если это так, мне все равно хотелось бы узнать больше о регулярных выражениях)?

Это было полезно?

Решение

Наконец разобрался, есть вариант условной замены:

?n:then:else

Итак, окончательный формат выглядит так:

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

Что даст желаемый результат:

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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top