Создайте фрагмент кода vscode, который может использовать переменное количество аргументов - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в 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 ]

1 голос
/ 04 октября 2019
"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

Вот демоверсия:

demo snippet of multiple arguments

Итак, еще раз необходимая форма просто v1 v2 v3. Между аргументами не должно быть пробела, но тогда вы получите def initialize(v1,v2,v3) без пробелов.

Нажмите Tab после последнего аргумента для запуска завершения.

Оказывается, фрагменты довольно мощные !!

Дляаналогичный вопрос об использовании нескольких аргументов, см. Фрагмент VSCode: добавьте несколько объектов в конструктор класса

0 голосов
/ 18 октября 2019

@ Марк Извините, у меня недостаточно репутации для комментария. Это действительно хороший трюк, я просто хочу знать, может ли он сделать больше. Например, если я хочу, чтобы часть совпадения использовалась позже? В более конкретном примере я хочу написать фрагмент для декоратора, который создаст что-то вроде: @decorator((some_other), (Int('arg1'),Str('arg2'),Float('arg3')),) def my_func(arg1, arg2, arg3): , затем я могу ввести произвольное количество аргументов с их типами, но только их имена будут скопированы в список аргументов функции.

Заранее спасибо.

...