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

时间:2019-10-03 18:47:43

标签: regex visual-studio-code code-snippets vscode-snippets

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

这是一个简单的代码段。我将为类初始化程序键入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 )会导致类似这样的结果...

primes=[]
for num in range(1,999999999999 + 1): 
    if num > 1: 
        for i in range(2,num): 
            if (num % i) == 0: 
                break 
        else: 
            primes.append(num)

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

2 个答案:

答案 0 :(得分: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)也没有空格。

在最后一个参数后点击 Tab 即可触发完成。

事实证明,摘要非常强大!

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

答案 1 :(得分:0)

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

谢谢。