Переименовать член структуры и все его использование в файле

Могу ли я с помощью emacs или IDE (MS/Mono/sun studio и т. д.) переименовать элемент структуры и все его использование (я имею в виду операторы -> или .) в файле? например у меня есть

struct foo { int a_1, int int b_2; //etc }

И я меняю структуру на что-то вроде этого:

struct foo { struct { int a_1, int b_2; } v; //etc }

И есть много f->a_1 или f.a_1 и f->b_2 или f.b_2 в исходном коде типа struct foo или struct foo*, которые теперь мне нужно заменить, чтобы компилятор нашел их в структуре v: f.v->a_1 вместо. Как я мог это сделать?

Regexp - уродливое решение (которое я мог бы сделать, если бы другое решение делало это вручную), но невозможно, потому что оно также должно соответствовать типу структуры. Итак, это нужно выполнить в текстовом редакторе/IDE, который знает о типах C. Если вы не знаете, как это сделать с помощью emacs, но можете сделать это с помощью IDE, скажите мне, пожалуйста.


person The Mask    schedule 11.01.2014    source источник
comment
Я не эксперт в этом, но не могли бы вы просто запросить замену с помощью Emacs, чтобы заменить ->a_1 на .v->a_1 и .a_1 на .v.a_1? Звучит как буквальная замена строки, не так ли?   -  person Drew    schedule 12.01.2014
comment
Может быть, это полезно: semantic-mode, Development->Navigate Tags->Find Tag References. Найдите свой тег. Там открывается Symref буфер. Там вы можете переименовать тег. Symref->Expand all entries, Rename symbol in open hits.   -  person Tobias    schedule 12.01.2014
comment
@Drew: Проблема в том, что есть другие члены структуры другого типа с тем же именем, которые тоже будут заменены. Но это не то, что я хочу, а определенный тип структуры   -  person The Mask    schedule 12.01.2014
comment
@Тобиас: Спасибо! Я попробую   -  person The Mask    schedule 12.01.2014
comment
Тогда, возможно, исправьте свой пример, поскольку он вроде бы удовлетворяется тем, что я предложил. Покажите пример, который соответствует тому, что вам действительно нужно; тот, который не поддается такому простому запросу-замене.   -  person Drew    schedule 13.01.2014
comment
Я думаю, что мое последнее утверждение говорит именно то, что я ищу...   -  person The Mask    schedule 13.01.2014
comment
Немного не по теме: не будет ли f->a_1 в f->v.a_1 вместо f.v->a_1?   -  person jpkotta    schedule 13.01.2014
comment
@jpkotta: Да. я отредактирую это   -  person The Mask    schedule 15.01.2014


Ответы (1)


Вы можете сделать это с помощью плагина RTags Emacs:

https://github.com/Andersbakken/rtags/

rtags-rename-symbol (привязка по умолчанию: C-x r R )

Отказ от ответственности:

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

Он также может переименовывать символы в нескольких файлах за один раз (если вы используете проект а-ля compile_commands.json), поэтому спрячьте/сохраните свои изменения, прежде чем тестировать свой код - на всякий случай.

person assem    schedule 15.01.2014