制作一个可以使用可变数量参数的 vscode 片段

Make a vscode snippet that can use a variable number of arguments

我是 VSCode 的新手。考虑代码片段,我四处寻找一种在片段中编写脚本的方法。我的意思不仅仅是填充或转换变量。例如...

这是一个简单的片段。我将为 class 初始值设定项键入 rci。当我输入方法参数时,我希望发生分配和文档以及其他一些事情。

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

可能吗?如何实现?可以有任意数量的参数。每个参数都会触发另一行 class 初始值设定项。

"Class Initializer": {
  "prefix": "rci",
  "body": [

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

  "description": "Initialize Class"
}

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

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

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

您输入的格式必须正确:

v1, v2, v3

这是一个演示:

所以再次 必要的形式就是 v1 v2 v3。参数之间不需要 space,但是你会得到 def initialize(v1,v2,v3) 而没有 space。

在触发完成的最后一个参数后点击 Tab

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

有关使用多个参数的类似问题,请参阅 VSCode snippet: add multiple objects to a class constructor