Живой шаблон WebStorm, отдельная строка входных данных

intellij-idea #webstorm #live-templates

#intellij-idea #webstorm #живые шаблоны

Вопрос:

Я хочу создать живой шаблон для createSelector :

 export const someSelector = createSelector(getThis, getThat, getSomethingElse, (this, that, somethingElse) => 
  $END$
)
 

Я могу заставить его работать довольно хорошо с одним аргументом (например, только getThis который затем приводит (this) к аргументам функции стрелки).

 // template text
createSelector($someSelector$, ($variable$) => $END$)

// variables
// expression for "variable": 
decapitalize(regularExpression(someSelector, "get", ""))
 

Это корректно работает с одним аргументом, как упоминалось выше, и почти корректно работает с несколькими аргументами, за исключением заглавных букв:

 createSelector(getThis, getThat, getSomethingElse, (this, That, SomethingElse) => /* $end$ */)
 

Я попытался обернуть все это, camelCase но, конечно, запятые и пробелы исчезли.

Проблема, очевидно, в том, что я обрабатываю всю строку сразу, поэтому вся строка выполняется через любую функцию форматирования строки. Похоже, что нет никакого способа обрабатывать отдельные экземпляры «get» отдельно.

Я попробовал группы захвата, которые, как я действительно думал, будут работать:

 decapitalize(regularExpression(someSelector, "get(w )", "$1"))
 

Но это ничего не заменяет, оно просто копирует все:

 createSelector(getThis, getThat, (getThis, getThat) => )
 

Есть ли какой-либо способ добиться этого?

ОБНОВЛЕНИЕ: я даже изучил Groovy script и написал следующее, которое работает на groovy playground, но получает в WebStorm тот же результат, что и в моем последнем примере выше!

 groovyScript("return _1.replaceAll(/get(w )/) { it[1].uncapitalize() };", someSelector)
 

Комментарии:

1. Поддерживает ли Java (или точнее regularExpression() ) l$1 в качестве шаблона замены? Живой тест: regex101.com/r/6faVqC/1 Наверное, нет … regular-expressions.info/refreplacecase.html

2. «Но это ничего не заменяет, оно просто копирует все целиком:» Не забудьте экранировать , находясь внутри двойных кавычек " regularExpression(someSelector, "get(\w )", "$1")

3. @LazyOne вот и все! Не стесняйтесь публиковать его в качестве ответа, чтобы я мог пометить его как таковой.

Ответ №1:

Это можно было бы сделать с помощью регулярных выражений .. но Java, похоже, не поддерживает l модификатор замены (который будет использоваться как l$1 вместо $1 в вашем исходном regularExpression() коде).

Живой пример (работает в PCRE2, например, в PHP): https://regex101.com/r/6faVqC/1

Документы по заменяющим модификаторам: https://www.regular-expressions.info/refreplacecase.html


В любом случае: все это обрабатывается Java, и вы передаете шаблон регулярных выражений или код GrovyScript в двойные кавычки. Поэтому любые символы должны быть экранированы.

Вам нужно заменить get(w ) на get(\w ) .

Кажется, что для меня здесь все работает просто отлично (где someSelector переменная Live Template):

 groovyScript("return _1.replaceAll(/get(\w )/) { it[1].uncapitalize() };", someSelector)