Make a vscode snippet that can use a variable number of arguments

萝らか妹 提交于 2019-12-11 15:34:10

问题


I am new to VSCode. Thinking about code snippets, I looked around for a way to kind of script inside the snippet. I mean to do more than just fill or transform a variable. For example...

This is a simple snippet. I am going to type rci for the class initializer. When I enter the method arguments I would like the assignment and documentation + some other things to happen.

rci<tab> and then def initialize(a, b)) to result in something like this...

attr_reader :a
attr_reader :b

# @param a [...] ...
# @param b [...] ...
def initialize(a, b)
  @a = a
  @b = b
end

Is it possible? How can it be achieved? There could be any number of arguments. And each argument would trigger another line of the class initializer.


回答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"
}

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\n/g will get triggered 3 times if you have 3 method arguments.

You will see this ${2:+\n} 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




回答2:


@Mark Sorry that I don't have enough reputation for a comment. It is a really nice trick, I just want to know if it can do more. For example, if I only want part of the matched to be used later? A more concrete example, I want to write a snippet for a decorator that will create something like: @decorator((some_other), (Int('arg1'),Str('arg2'),Float('arg3')),) def my_func(arg1, arg2, arg3): then I can type in an arbitrary number of arguments with their types, but only their names are copied to the argument list of the function.

Thanks in advance.



来源:https://stackoverflow.com/questions/58225204/make-a-vscode-snippet-that-can-use-a-variable-number-of-arguments

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!