我最近创建了很多 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();
}    

到目前为止,我可以使用 1 个参数或多个参数来格式化它,而不是所有可能的组合(零、一、多个)。

大纲是当前的,我只需要弄清楚第二个 ${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 arg,可能是由于我对它们缺乏理解:

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