4

我是 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

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

4

1 回答 1

10
"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"
}

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

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

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

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

v1, v2, v3

这是一个演示:

多个参数的演示片段

因此,必要的形式又是 justv1 v2 v3。参数之间不需要有空格,但是你也会得到def initialize(v1,v2,v3)没有空格的。

在最后一个参数之后点击Tab以触发完成。

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

有关使用多个参数的类似问题,请参阅VSCode 片段:将多个对象添加到类构造函数

于 2019-10-03T23:57:58.907 回答