Создайте фрагмент vscode, который может использовать переменное количество аргументов
Я новичок в 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
Является ли это возможным? Как этого добиться? Аргументов может быть любое количество. И каждый аргумент запускал бы другую строку инициализатора класса.
2 ответа
"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, если есть другая,
между аргументами. Итак, финал)
после последнего аргумента не будет запускаться другая новая строка - поэтому вывод точно соответствует вашему желаемому выводу в отношении новых строк (но вы можете легко добавить или удалить новые строки).
Ваш ввод должен быть в правильной форме:
v1, v2, v3
Вот демо:
И снова необходимая форма - это простоv1 v2 v3
. Между аргументами не должно быть пробелов, но тогда вы получитеdef initialize(v1,v2,v3)
без пробелов тоже.
Нажмите Tab после последнего аргумента, чтобы вызвать завершение.
Оказывается, сниппеты очень полезны!!
Аналогичный вопрос об использовании нескольких аргументов см. В фрагменте кода VSCode: добавление нескольких объектов в конструктор класса.
@Mark Извините, что у меня недостаточно репутации для комментария. Это действительно хороший трюк, я просто хочу знать, может ли он больше. Например, если я хочу, чтобы позже использовалась только часть найденного? Более конкретный пример. Я хочу написать отрывок для декоратора, который создаст что-то вроде:
@decorator((some_other), (Int('arg1'),Str('arg2'),Float('arg3')),)
def my_func(arg1, arg2, arg3):
тогда я могу ввести произвольное количество аргументов с их типами, но в список аргументов функции копируются только их имена.
Заранее спасибо.