Очистить все методы в файле в vim, regex? - PullRequest
4 голосов
/ 25 января 2009

Я использую редактор vim, и я хотел очистить все методы в классе, например

class A {

     public:
        int getNumber() const {
             return number;
        }

        void setNumber(int num) {
             number = num;
        }


};

Я хотел иметь регулярное выражение, где я мог бы заменить, чтобы результат был таким

class A {

     public:
        int getNumber() const;

        void setNumber(int num};


};

Я знаю, что могу использовать% s для глобального подстановки, но все, что мне нужно, это получить тело метода.

Ответы [ 5 ]

2 голосов
/ 25 января 2009

Поскольку фигурные скобки могут, конечно, вкладываться в ваши функции, к сожалению, невозможно создать регулярное выражение, которое могло бы соответствовать соответствующей конечной фигурной скобке.

К счастью, у VIM есть перемещение к соответствующему (которое будет перемещаться вперед к следующей скобке / скобке / и т. Д. И переходить к соответствующей открывающей / закрывающей единице) с использованием клавиши% (shift-5 на большинстве раскладки клавиатуры, я полагаю?), поэтому, в основном, стоя на месте перед открывающей скобкой, c%; заменит все тело точкой с запятой.

Найти открывающую скобку функции - это совсем другой вопрос, и я посмотрю, смогу ли я придумать что-нибудь для вас, но, чтобы вы начали, выполните это один раз, а затем просто продолжайте нажимать. (точка), чтобы выполнить его снова для каждой функции.

1 голос
/ 25 января 2009

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

[ESC]qa$d%i;0[ESC]q

Затем в первой строке других методов вы можете сделать это:

[ESC]@a

Вот как это работает:

  • [ESC] - клавиша Escape помещает вас в правильный режим
  • qa - сохранить следующие команды как макрос с именем "a"
  • $ - перейти в конец строки
  • d% - удалить до совпадения кронштейн
  • я; - введите точку с запятой
  • [ESC] - клавиша Escape помещает вас в правильный режим
  • q - прекратить запись макроса

  • @ a - снова вызывает макрос (на строка для следующего метода)

Надеюсь, это поможет.

0 голосов
/ 26 января 2009

Я бы поиграл с ctags, чтобы построить список функций, объявленных и определенных в вашем заголовочном файле. Список будет содержать строку встроенного определения, а не регулярное выражение для поиска строки.

Затем в обратном порядке перейдите к строке определения функции, найдите ее открывающую скобку и примените d%. Он должен работать нормально, если в комментариях функции нет несбалансированных скобок.

Кстати, чтобы не потерять определение, у меня есть команда : MOVEIMPL , которая перемещает определение встроенной функции в связанный файл .cpp.

0 голосов
/ 26 января 2009

Выполнение этого с регулярным выражением для всех возможных входов невозможно, как говорит Роу. Вам понадобится полный анализатор для вашего языка. Но приведенное ниже регулярное выражение решает подмножество проблемы, которой может быть достаточно, если ваш текст ОЧЕНЬ регулярен и придерживается некоторых ограничений:

  • Открывающая фигурная скобка - последний символ в той же строке, что и заголовок метода
  • Закрывающая скобка имеет ту же величину, что и открывающая строка, находится на отдельной строке и является последним символом в строке
  • Строка начинается с int или void (вы можете расширить этот список, включив в него все соответствующие типы), игнорируя начальные пробелы

Так что это работает на вашем примере ввода:

:%s/\v((^\s+)(int|void).{-})\s+\{$\_.{-}^\2\}$/\1;/
  • \v: «очень волшебный» режим (избегает необходимости убегать от обратной косой черты)
  • ((^\s+): (начать захват \ 1); захватить уровень отступа для этой строки
  • (int|void): первое слово в строке (при необходимости добавьте в этот список)
  • .{-}): не жадное совпадение в этой строке (окончание захвата \ 1)
  • \s+{$: столько пробелов, сколько возможно, затем {, затем конец строки
  • \_.{-}: не жадное совпадение со всем, включая переводы строк
  • ^\2\}$: с начала строки укажите количество пробелов, которые мы записали выше, затем конечную скобку в конце строки

Если вы знаете, сколько пробелов в строках заголовка метода с отступом, вы можете вставить это в регулярное выражение вместо (^\s+), чтобы сделать его более надежным.

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

0 голосов
/ 25 января 2009

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

:help q
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...