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

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

我是VSCode的新手。考虑到代码片段,我环顾四周,寻找一种在该片段内编写脚本的方法。我的意思是要做的不只是填充或转换变量。例如...

这是一个简单的代码段。我将为类初始化程序键入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

有可能吗?如何实现?可以有任意数量的参数。每个参数都会触发类初始化程序的另一行。

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

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

  "description": "Initialize Class"
}

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

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

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

您的输入必须采用正确的形式:

v1, v2, v3

这里是一个演示:

demo snippet of multiple arguments

同样,必要的形式只是v1 v2 v3。参数之间不需要有空格,但是您会得到def initialize(v1,v2,v3)也没有空格。

在要触发完成的最后一个参数之后单击[

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

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

0
投票
@@ Mark对不起,我没有足够的声誉来发表评论。这是一个非常好的技巧,我只想知道它是否还能做更多。例如,如果我只希望匹配的部分稍后使用?一个更具体的示例,我想为装饰器编写一个代码段,它将创建类似以下内容的代码: @decorator((some_other), (Int('arg1'),Str('arg2'),Float('arg3')),) def my_func(arg1, arg2, arg3): 那么我可以输入任意数量的参数及其类型,但是只有它们的名称会被复制到函数的参数列表中。

提前感谢。

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