регулярное выражение замены: как сделать отступ для переменного числа строк в середине остальной части матча - PullRequest
2 голосов
/ 02 апреля 2012

Это вопрос, который у меня есть с точки зрения регулярного выражения vim, но регулярное выражение python также будет полезным и желанным.Давайте возьмем в качестве примера эту функцию python:

def func_hello (*args):
    for arg in args:
        print 'Hello, %s!' % arg

Я хочу превратить это в метод в классе (не совсем - только в этом примере), с методом method_hello (на самом деле я не называювсе так).Я могу сделать что-то вроде этого:

:%s/def func_\(\w*\) (\(.*\)):\(\(\n\s\+.*\)\+\)/class \u\1 (object):\r\tmethod_\1 (self, \2):\r\t\3/g

Однако, это дает мне это:

class Hello (object): 
    method_hello (self, arg1, arg2, arg3): 

    for arg in arg1, arg2, arg3: 
        print 'Hello, %s!' % arg 

Я пытался сделать что-то вроде этой работы, чтобы собрать несколько строк (что он делает)

\(\(\n\s\+.*\)\+\)

... и затем сделайте отступ для всех них этим (чего не происходит)

\r\t\3

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

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 04 апреля 2012

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

nmap <yourkey> vip>Oclass Hello(object):<esc>+f(aself, <esc>

Или что-то в этом роде. В большинстве случаев, с которыми я встречался, в vim проще определять горячие клавиши в терминах других горячих клавиш.

...