Отрицательные выражения в Vim - PullRequest
0 голосов
/ 27 марта 2012

Вопрос:

Как мне преобразовать var x+=1+2+3+(5+6+7) в var x += 1 + 2 + 3 + ( 5 + 6 + 7 )

Подробности:

Используя регулярные выражения, что-то вроде :%s/+/\ x\ /g не будет работать, потому чтоон преобразует += в + = (среди прочих проблем).Поэтому вместо этого можно использовать отрицания (негативы, ноты, как бы они ни назывались), например :%s/\s\@!+/\ +/g, что примерно так же сложно, как сказать «знак плюс без пробела перед ним».Но теперь это преобразует что-то вроде x++ в x + +.Что мне нужно, это что-то более сложное.Мне нужно более одного ограничения в отрицании и дополнительное ограничение после этого.Примерно так, но это не работает :%s/[\s+]\@!+\x\@!/\ +/g

Может кто-нибудь предоставить один или два оператора регулярных выражений, которые добавят пример оператора, чтобы я мог смоделировать остальные мои правила наit / them.

Мотивация:

Я считаю, что beautifiers для таких языков, как javascript или PHP, не дают мне полный контроль (см. здесь ).Поэтому я пытаюсь использовать регулярные выражения для следующих преобразований:

  • foo(1,2,3,4)foo( 1, 2, 3, 4 )
  • var x=1*2*3var x = 1 * 2 * 3
  • var x=1%2%3var x = 1 % 2 % 3
  • var x=a&&b&&cvar x = a && b && c
  • var x=a&b&cvar x = a & b & c

Любая обратная связь также будет оценена

1 Ответ

0 голосов
/ 27 марта 2012

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

:%s/\(\w\)\([+\-*\/%|&~)=]\)/\1\ \2/g
:%s/\([+\-*\/%|&~,(=]\)\(\w\)/\1\ \2/g

И это работает довольно хорошо. Вот некоторые результаты.

(1+2+3+4,1+2+3+4,1+2+3+4) --> ( 1 + 2 + 3 + 4, 1 + 2 + 3 + 4, 1 + 2 + 3 + 4 )
(1-2-3-4,1-2-3-4,1-2-3-4) --> ( 1 - 2 - 3 - 4, 1 - 2 - 3 - 4, 1 - 2 - 3 - 4 )
(1*2*3*4,1*2*3*4,1*2*3*4) --> ( 1 * 2 * 3 * 4, 1 * 2 * 3 * 4, 1 * 2 * 3 * 4 )
(1/2/3/4,1/2/3/4,1/2/3/4) --> ( 1 / 2 / 3 / 4, 1 / 2 / 3 / 4, 1 / 2 / 3 / 4 )
(1%2%3%4,1%2%3%4,1%2%3%4) --> ( 1 % 2 % 3 % 4, 1 % 2 % 3 % 4, 1 % 2 % 3 % 4 )
(1|2|3|4,1|2|3|4,1|2|3|4) --> ( 1 | 2 | 3 | 4, 1 | 2 | 3 | 4, 1 | 2 | 3 | 4 )
(1&2&3&4,1&2&3&4,1&2&3&4) --> ( 1 & 2 & 3 & 4, 1 & 2 & 3 & 4, 1 & 2 & 3 & 4 )
(1~2~3~4,1~2~3~4,1~2~3~4) --> ( 1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4 )
(1&&2&&3&&4,1&&2&&3&&4,1&&2&&3&&4) --> ( 1 && 2 && 3 && 4, 1 && 2 && 3 && 4, 1 && 2 && 3 && 4 )
(1||2||3||4,1||2||3||4,1||2||3||4) --> ( 1 || 2 || 3 || 4, 1 || 2 || 3 || 4, 1 || 2 || 3 || 4 )
var x=1+(2+(3+4*(965%(123/(456-789))))); --> var x = 1 +( 2 +( 3 + 4 *( 965 %( 123 /( 456 - 789 )))));

Кажется, все работает нормально, кроме вложенных скобок. Если я исправлю проблему с вложенными скобками, я обновлю ее здесь.

...