基于多个参数扩展一个vscode代码段,参数的数量可以变化

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

我是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
1个回答
1
投票
"Class Initializer": {
  "prefix": "rci",
  "body": [

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

  "description": "Initialize Class"
}

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

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

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

def initialize行仅一次捕获所有参数(没有g标志!)。

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

(v1, v2, v3)

这里是一个演示:

multiple args in snippets

同样,必要的形式是(v1 v2 v3),即使对于单参数情况,参数也必须用()包围。参数之间不需要有空格,但是您会得到def initialize(v1,v2,v3)也没有空格。

在最后的)之后点击[Tab以触发完成。

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

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