VSCode代码段-代码段内的脚本编写

问题描述 投票:0回答:1

我是VS Code的新手。考虑到代码片段,我环顾了片段内部的一种脚本编写方式。我的意思是要做的不只是填充或转换变量。例如...

这是一个简单的代码段。我将为类初始化程序键入rci。当我输入方法参数时,我想要赋值和文档以及其他一些事情。

${4}

${3}
def initialize(${1})
  ${2}
end

[rci<tab>然后是def initialize(a, b))会得到类似这样的结果...

attr_reader :a
attr_reader :b

# @param a [...] ...
# @param b [...] ...
def initialize(a, b)
  @a = a
  @b = b
end

有可能吗?如何实现?

visual-studio-code code-snippets vscode-snippets
1个回答
0
投票
"Class Initializer": {
  "prefix": "rci",
  "body": [

    "${1/(([^\\s,]*?)(,\\s*|\\)))/attr_reader :$2\n/g}",
    "${1/(([^\\s,]*?)((,\\s*)|\\)))/# @param $2 [...]${4:+\n}/g}",
    "${1/((([^\\s,]*?)(,\\s*|\\)))*)/def initialize($1/}",
    "${1/(([^\\s,]*?)((,\\s*)|\\)))/\t@$2 = $2${4:+\n}/g}",
    "end"
  ],

  "description": "Initialize Class"
}

使其适用于任意数量的方法参数的关键是使它们进入相同的正则表达式捕获组

然后,设置了全局标志,每个捕获组将触发替换文本。因此,例如,如果您有3个方法参数,attr_reader :$2\n将被触发3次。

您将在上面的转换中看到此${4:+\n}。这意味着如果有捕获组4,请添加换行符。正则表达式的设计是:如果参数之间存在另一个,,则只有一个捕获组4。因此,最后一个参数之后的最后一个)不会触发另一个换行符-因此输出与换行符的输出完全匹配(但您可以轻松地添加或删除换行符)。

def initialize行与用于一次捕获所有参数(没有g标志!)的正则表达式略有不同,因为不应为每个参数重复def initialize文本。

由于这是一个棘手的问题和一个正则表达式,因此您的输入必须采用正确的形式:

v1, v2, v3)

这里是一个演示:

multiple args snippet

因此再次必要的形式是v1 v2 v3)在结尾必须有一个)-即使对于单参数情况也是如此。参数之间不需要有空格,但是您会得到def initialize(v1,v2,v3)也没有空格。

)之后点击Tab以触发完成。

事实证明代码片段非常强大!

© www.soinside.com 2019 - 2024. All rights reserved.