"Class Initializer": {
"prefix": "rci",
"body": [
"${1/([^,]+)([,\s]*|)/attr_reader :$1
/g}",
"${1/([^,]+)([,\s]*|)/# @param $1 [...]${2:+
}/g}",
"def initialize($1)",
"${1/([^,]+)((,\s*)|)/@$1 = $1${2:+
}/g}",
"end"
],
"description": "Initialize Class"
}
The key to get it to work for any number of method arguments is to get them into the same regex capture group.
Then, with the global flag set, each capture group will trigger the replacement text. So for instance, /attr_reader :$1
/g
will get triggered 3 times if you have 3 method arguments.
You will see this ${2:+
}
in the transforms above. That means if there is a capture group 2, add a newline. The regex is designed so that there is only a capture group 2 if there is another ,
between arguments. So a final )
after the last argument will not trigger another newline - so the output exactly matches your desired output as to newlines (but you could easily add or remove newlines).
Your input must be in the correct form:
v1, v2, v3
Here is a demo:
So again the necessary form is just v1 v2 v3
. There doesn't need to be a space between the arguments but then you would get def initialize(v1,v2,v3)
without spaces either.
Hit Tab after the final argument to trigger completion.
It turns out snippets are pretty powerful!!
For a similar question about using multiple arguments, see VSCode snippet: add multiple objects to a class constructor
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…