Emacs отстъп след макрос в C

#define INIT_MACRO create(); some(); enviroment();
...
void function(){
  INIT_MACRO
    extra_indented();
  normal_indented();
}

как да накарам emacs да се справи правилно с горната ситуация, когато се поиска автоматично отстъп?

EDIT единственото решение, което виждам, е да кажа на emacs да третира редовете, съдържащи само главни букви, долни черти и интервали, сякаш имат точка и запетая в края... но как да направя това?


person fakedrake    schedule 12.07.2011    source източник
comment
Не мисля, че това е изпълнимо. Можете да премахнете последния ; и да го добавите към самия макрос. Това няма да заблуди отстъпа на emacs.   -  person Diego Sevilla    schedule 12.07.2011
comment
Защо макрос, а не функция?   -  person Bo Persson    schedule 12.07.2011


Отговори (4)


Това работи:

#define INIT_MACRO do { create(); some(); enviroment(); } while (0)
...
void function(){
  INIT_MACRO;
  extra_indented();
  normal_indented();
}

Обикновено е по-добре да използвате този трик, за да избегнете проблеми, когато използвате:

if (...)
  MACRO();
else
  ...

и точка и запетая на всеки ред се чете по-лесно според мен.

person Simon    schedule 12.07.2011
comment
Това е начинът, по който се справях досега, но не бих се чувствал комфортно да променям кода в хранилището по желание, защото отстъпът ми се разпада... (вижте РЕДАКТИРАНЕ) - person fakedrake; 12.07.2011
comment
Както ви казах, за мен това не е само заради отстъпа, но и за сигурност и четливост. - person Simon; 12.07.2011
comment
валидна точка, но все пак бих се радвал, ако мога просто да направя това, което предлагам в редакцията в някои случаи - person fakedrake; 12.07.2011

cc-mode има това персонализиране чрез променлива c-macro-names-with-semicolon. Вижте документацията за повече информация.

person immerrr    schedule 13.05.2013

Защо просто не завършите реда INIT_MACRO с ;?

person Dave    schedule 12.07.2011

Използването на макрос като обвивка на функция без (); в края, когато го извиквате и без обграждане на дефиницията с do { и } while(0) така или иначе не се прави.. прави кода грозен, труден за поддръжка и не се поддържа от един стандарт за кодиране на C... с други думи това се нарича код на кървящото око. Така че не е възможно с настройките по подразбиране.

Ще трябва да направите свой собствен основен / второстепенен режим. За да поддържате този нов тип синтаксис... Или можете да погледнете текущия си cc-mode.el.

person DipSwitch    schedule 12.07.2011